我正在通过Java解析groovy脚本,使用反射从脚本中获取方法。对于我的项目,我需要所有的方法,非合成和公开。
GroovyScriptEngine groovyScriptEngine = new GroovyScriptEngine(scriptFile.getAbsolutePath());
Class<GroovyObject> scriptClass = groovyScriptEngine.loadScriptByName(scriptFile.getName());
// some code
GroovyObject groovyObject = scriptClass.getConstructor().newInstance();
if (groovyObject != null) {
Method[] declaredMethods = groovyObject.getClass().getDeclaredMethods();
return Arrays.stream(declaredMethods)
.filter(m -> !m.isSynthetic() && Modifier.isPublic(m.getModifiers()))
.collect(Collectors.toList());
}对于普通的groovy类,它返回所有setter和setter以及公共用户定义的方法。
例如:
class MyGroovyClass {
def int number = 1
int add(int anotherNumber) {
return number + anotherNumber
}
}解析groovy类返回getNumber、setNumber、addNumber。对于一个空的groovy类(没有字段,没有声明的方法),它返回一个空列表。
但是对于一个空脚本 (=完全空文件),它返回方法"run“和”“。
为什么从空的groovy脚本中获取和过滤(对于非合成的和公共的)方法返回"run“和"main"?我如何过滤这两种方法?(或者我能早点抓住那个案子吗?)
发布于 2020-01-29 09:11:17
嗯,groovy脚本必须编译成运行在JVM上并有一个入口点的东西,显然它只是一个带有main方法的类。
因此,基本上groovy脚本被编译成一个类,脚本的主体被复制到run方法中,main方法必须指定为入口点,我已经解释过了。在某个时候,main将调用run (间接)。
因此,对于每个脚本,您将得到以下方法。
它在groovy文档中的描述(见3.2. Script class段)
https://stackoverflow.com/questions/59961474
复制相似问题