列出Java中Groovy类的声明方法
我有一个名为列出Java中Groovy类的声明方法,java,methods,groovy,Java,Methods,Groovy,我有一个名为sample.groovy的groovy文件,其中包含不同的方法: class sample { def doOperation() { println("Inside doOperation()") } def setData(String str) { println("Incoming data : " + str) } } 我只定义了两种方法:doOperation()和setDa
sample.groovy
的groovy文件,其中包含不同的方法:
class sample {
def doOperation()
{
println("Inside doOperation()")
}
def setData(String str)
{
println("Incoming data : " + str)
}
}
我只定义了两种方法:doOperation()
和setData()
,我只想列出这两种方法
我使用了反射,并尝试使用getDeclaredMethods()
列出方法。但是它列出了上面的方法和方法,比如:setProperty
,getProperty
,setMetaClass
,等等
我只想列出在这个特定文件中定义的方法。您所要求的实际上没有(太多)意义 你看,Java语言对Groovy语言一无所知 关键是Groovy源代码将在某个时刻编译成JVM字节码 这意味着:与Java语言相比,Groovy“添加”的所有东西。。。最后,表示为JVM字节码 换句话说:groovy编译器实现了它的“魔力”(例如通过添加各种方法);所有这些都会进入.class文件。然后当你“调查”这件事的时候,同学们。。。你把所有的东西都放进去了。因为“java反射”没有“这个方法实际上是由groovy程序员编写的”和“这个方法是由groovy转换过程添加的”的概念 长话短说:如果有的话,您需要研究Groovy方面的机制;因为只有在Groovy方面,您才能知道“sample”有这两种方法。根据,生成的“Groovy”方法应该标记为合成的: Java编译器引入的任何构造如果在源代码中没有相应的构造,则必须标记为合成,但默认构造函数、类初始化方法以及Enum类的方法的值和valueOf除外 记住这一点,您可以过滤掉类上的合成方法,以便在源代码中只提供方法:
def methods = sample.declaredMethods.findAll { !it.synthetic }
如果您正在寻找纯Java解决方案,可以执行以下操作:
List<Method> methods = new ArrayList<>();
for (Method m : sample.class.getDeclaredMethods()) {
if (!m.isSynthetic()) {
methods.add(m);
}
}
List methods=newarraylist();
对于(方法m:sample.class.getDeclaredMethods()){
如果(!m.isSynthetic()){
方法:添加(m);
}
}
或者使用Java 8 streams API:
List<Method> methods = Arrays.stream(sample.class.getDeclaredMethods())
.filter(m -> !m.isSynthetic())
.collect(Collectors.toList());
List methods=Arrays.stream(sample.class.getDeclaredMethods())
.filter(m->!m.isSynthetic())
.collect(Collectors.toList());
您应该在下面尝试只获取您的方法,而不是继承的方法:-
def methods = MyClass.declaredMethods.findAll { !it.synthetic }
希望它能帮助您……:)我已经尝试使用提供的Java 8 streams API,如果groovy文件包含一个像我的示例一样定义的类,效果会很好。但是如果groovy文件只包含方法,并且如果我尝试列出方法,则还会列出main()和run()方法。我不想要main()和run()方法。请帮助我…如果您真的想省略这些方法,可以使您的条件
!m.isSynthetic()&&&!m.getName().equals(“main”)&&!m.getName().equals(“run”)
。当然,如果您决定在类中显式地命名实际方法run
或main
,那么这些方法现在也将被省略。