沙箱与可用类
脚本能碰哪些 Java 类,以及为什么要有这条线。
为什么有白名单
资源包是从网上下载的,脚本会在玩家机器上执行。 不加限制的话,一个资源包就能读写任意文件、发起网络请求。 所以 RTE 只放行绘图、文本、数学、时间这些必要的包。
允许的包
以下前缀开头的类可直接使用:
| 包 | 典型用途 |
|---|---|
java.awt | BufferedImage、Graphics2D、Color、Font —— 画 LCD 的主力 |
java.util | ArrayList、HashMap、Arrays 等集合 |
java.text | 数字与日期格式化 |
java.time | 时间日期计算 |
java.math | BigInteger、BigDecimal、RoundingMode |
mtr | MTR 自身的类 |
cn.jstxjf_.rte.scripting.compat | RTE 的兼容对象 |
允许的单个类
除上述包外,这些 java.lang 下的类被单独放行:
| 分类 | 类 |
|---|---|
| 基本类型包装 | Boolean、Byte、Short、Integer、Long、Float、Double、Character |
| 文本 | String、CharSequence、StringBuilder |
| 数学 | Math、StrictMath、Number |
| 基础 | Object、Iterable、Comparable、Enum |
| 异常 | Exception、RuntimeException、IllegalArgumentException、IllegalStateException |
java.math 在白名单里,是因为有资源包的报站脚本用
BigInteger 做编号运算。如果你的脚本报「类不可访问」,
先确认用的类在上面两张表里。不在白名单里的
典型的被挡下的:
java.io/java.nio—— 任意文件读写。读资源请用Resourcesjava.net—— 网络请求java.lang.System—— 环境变量、退出进程java.lang.Runtime/ProcessBuilder—— 执行外部命令- 反射相关 —— 绕过限制的常见路径
加载期与运行期
脚本加载阶段(顶层代码执行时)不做限制,
运行期(create / render / dispose 内)才启用白名单。
这是为了让脚本能在加载时完成必要的初始化。
不要利用这个差异在加载期缓存受限类的引用 ——
这属于绕过限制,将来可能被收紧。
动态加载额外类
RTE 支持资源包声明要额外注入的类,注入后以简单类名作为全局名。 这条路径同样受白名单约束。