Java Groovy方法isSynthetic对于run和main是错误的

Java Groovy方法isSynthetic对于run和main是错误的,java,groovy,Java,Groovy,我正在使用反射通过Java解析groovy脚本,以从脚本中获取方法。 对于我的项目,我需要所有非合成和公开的方法 GroovyScriptEngine groovyScriptEngine = new GroovyScriptEngine(scriptFile.getAbsolutePath()); Class<GroovyObject> scriptClass = groovyScriptEngine.loadScriptByName(scriptFile.getName());

我正在使用反射通过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类将返回getNumber、setNumber、addNumber。 对于没有字段、没有声明方法的空groovy类,这将返回一个空列表

但是对于空脚本=完全空的文件,这将返回run和main方法

为什么从空groovy脚本获取和筛选非合成和公共方法时返回run和main?
如何筛选这两种方法?或者我能早点发现这种情况吗?

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

所以基本上groovy脚本被编译成一个类,脚本的主体被复制到run方法中,main方法必须被指定为入口点,正如我所解释的。在某个时候,main将间接调用run

因此,对于每个脚本,您将获得这些方法


其描述见第3.2段。Script类

有趣的是,GroovyScript引擎或任何东西组成了一个完全虚构的类,并插入main和run方法。而不仅仅是结束空文件=>无脚本=>无代码。再见!好吧,这可能是主观的,但空脚本仍然可以运行,就像使用空的main方法创建java类一样,它仍然可以运行。。。。但是我不是groovy的成员,所以我不能给你一个限定的答案:嗯,是的,但是你的java示例是有意义的,因为至少有一个类。但在我的问题中,文件是完全空的。根本没有代码。这让我觉得这根本不会编译或者导致null/NPE。但是groovy只是组成了一个类,这很奇怪。谢谢你的评论。
class MyGroovyClass {
     def int number = 1

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