首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于运行和main,Groovy方法isSynthetic是假的。

对于运行和main,Groovy方法isSynthetic是假的。
EN

Stack Overflow用户
提问于 2020-01-29 06:20:20
回答 1查看 91关注 0票数 0

我正在通过Java解析groovy脚本,使用反射从脚本中获取方法。对于我的项目,我需要所有的方法,非合成和公开。

代码语言:javascript
复制
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以及公共用户定义的方法。

例如:

代码语言:javascript
复制
class MyGroovyClass {
     def int number = 1

     int add(int anotherNumber) {
          return number + anotherNumber
     }
}

解析groovy类返回getNumber、setNumber、addNumber。对于一个空的groovy类(没有字段,没有声明的方法),它返回一个空列表。

但是对于一个空脚本 (=完全空文件),它返回方法"run“和”“。

为什么从空的groovy脚本中获取和过滤(对于非合成的和公共的)方法返回"run“和"main"?我如何过滤这两种方法?(或者我能早点抓住那个案子吗?)

EN

回答 1

Stack Overflow用户

发布于 2020-01-29 09:11:17

嗯,groovy脚本必须编译成运行在JVM上并有一个入口点的东西,显然它只是一个带有main方法的类。

因此,基本上groovy脚本被编译成一个类,脚本的主体被复制到run方法中,main方法必须指定为入口点,我已经解释过了。在某个时候,main将调用run (间接)。

因此,对于每个脚本,您将得到以下方法。

它在groovy文档中的描述(见3.2. Script class段)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59961474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档