如何通过反射api将值从java注入groovy脚本中的字段?

oxcyiej7  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(370)

非常简单的groovy脚本:

@Field
List list

def execute(Object args) {
    return list[0]
}

我尝试用java编写简单的代码:

final GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
final File file = new File("<path to groovy file>");
GroovyCodeSource groovyCodeSource = new GroovyCodeSource(file);
final Class groovyClass = groovyClassLoader.parseClass(groovyCodeSource);
final List<String> testList = Collections.singletonList("test");
final Binding context = new Binding();
context.setVariable("list", testList );
final Script script = InvokerHelper.createScript(groovyClass, context);
final Field list = groovyClass.getField("list");
list.setAccessible(true);
list.set(null, testList );
final Object returnValue = script.invokeMethod("execute", null);

但是在groovyclass.getfield(“list”)字段中;我有个例外你能帮我吗?为什么会这样?

4bbkushb

4bbkushb1#

基于在原始代码中编写的内容,我假设groovy中字段的默认可见性是 private ; 否则,我们将 list.setAccessible(true) 如果不是过时的话,这将是多余的。
但是javadoc Class::getField(String) 表示“返回一个字段对象,该对象反映由该类对象表示的类或接口的指定公共成员字段。”
从这一点上,我猜像下面这样更改代码应该可以做到这一点:

…
final Script script = InvokerHelper.createScript(groovyClass, context);
final Field list = groovyClass.getDeclaredField("list");
list.setAccessible(true);
…

请参阅相应的javadoc。

相关问题