Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列出Java中Groovy类的声明方法_Java_Methods_Groovy - Fatal编程技术网

列出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
,那么这些方法现在也将被省略。