Fluxon 提供两类可选的 Java 互操作表达式:
new:构造任意 Java 类的实例。
static:访问 Java 类的静态字段或调用静态方法。
该特性基于 Java 反射实现,默认在嵌入式场景中关闭;如果你在宿主侧执行脚本,需要显式开启。
启用方式
宿主集成(Java)
new/static 由 CompilationContext#allowJavaConstruction 控制(默认 false):
如果你还希望在 new/static 的结果上使用成员访问 .(反射),需要同时启用:
也可以通过全局默认值启用(不建议对不可信脚本使用):
CLI / REPL
交互式控制台通常会默认启用 new/static 与成员访问 .,因此在 REPL 中使用往往不需要额外配置
(见 命令行与 REPL)。
new:构造对象
语法:
要点:
- 类名必须是 全限定名(例如
java.util.ArrayList),不会自动根据 import 推断。
- 参数是普通表达式;构造函数会按实参类型匹配最合适的重载(不匹配会报错)。
示例:
构造并传入集合参数(复制构造):
如果开启了成员访问 .,也可以直接对新对象做链式成员访问:
static:访问静态成员
语法:
示例(静态方法):
示例(静态字段/常量):
括号语法(消除歧义 + 支持链式)
当你需要在静态字段结果上继续做 .member 链式访问时,建议使用括号语法锁定类名:
原因是:不带括号时,解析会把最后一个 . 之前的内容当作“类名”,因此
static java.lang.System.out.println(...) 会被解析为类 java.lang.System.out 的静态方法 println(...),从而导致类找不到。
括号语法同样适用于“静态字段 → 实例方法”的组合:
常见错误与边界
- 特性未开启:解析阶段会报错并提示
ctx.setAllowJavaConstruction(true)。
- 类不存在:
Class not found: <className>。
- 成员/构造函数不存在或不匹配:会抛出
MemberNotFoundError 或运行时异常(取决于调用点)。
- 安全风险:
new/static 允许脚本触达任意可见的 Java API;对不可信脚本请保持禁用。
相关链接