从Java中列出Groovy类的声明方法

时间:2016-06-03 12:21:12

标签: java methods groovy

我有一个名为sample.groovy的groovy文件,其中包含不同的方法:

class sample {

    def doOperation()
    {
        println("Inside doOperation()")
    }

    def setData(String str)
    {  
        println("Incoming data : " + str)
    }   
}

我只定义了两种方法:doOperation()setData(),我只想列出这两种方法。

我使用了反射并尝试使用getDeclaredMethods()列出方法。但它列出了上述方法和方法,如:setPropertygetPropertysetMetaClass等。

我想列出此特定文件中定义的方法。

3 个答案:

答案 0 :(得分:2)

你所要求的并不是真的有太多意义。

你知道,Java语言知道没有关于Groovy语言。

重点是Groovy源代码将在某些时候被编译成JVM字节码。

这意味着:所有Groovy"添加的东西"与Java语言相比......最终表示为JVM字节码。

换句话说:groovy编译器执行其" magic" (例如通过添加各种方法);所有这些都进入.class文件。当你看到"进入"那个.class ...你得到了那里的所有东西。作为" java反射"没有概念"这种方法真的是由时髦的程序员编写的#34;与#34;这种方法是通过一些groovy转换过程添加的。)

长话短说:如果有的话,你需要研究Groovy方面的机制;因为只有那里你才能知道"样品"有这两种方法。

答案 1 :(得分:0)

你应该尝试下面的方法来获取你的方法而不是继承的方法: -

def methods = MyClass.declaredMethods.findAll { !it.synthetic }

希望它会帮助你...... :)

答案 2 :(得分:-1)

根据JLS 13.1.7," Groovy"生成的方法应标记为合成:

  

Java编译器引入的源代码中没有相应构造的构造必须标记为合成,除了默认构造函数,类初始化方法以及Enum类的values和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);
    }
}

或使用Java 8流API:

List<Method> methods = Arrays.stream(sample.class.getDeclaredMethods())
        .filter(m -> !m.isSynthetic())
        .collect(Collectors.toList());