使用编译时检查获取类的方法对象(在java中)

时间:2011-08-05 17:13:04

标签: java reflection

我想得到一个与此类似的Method对象:

Method myMethod = MyClass.class.getDeclaredMethod("myDeclaredMethod",Arg1Class.class);

但是!我想编译时间检查方法“myDeclaredMethod”的存在。我实际上不需要动态选择方法,我只需要对它的引用,所以我可以将它传递给另一个方法......类似于C有函数指针的方式。我想做这样的事情:

#include <stdio.h>

void helloWorld() {
    printf("hello\n");
}

void runFunction( void (myfunc)() ) {
    myfunc();
}

int main() {
    runFunction(helloWorld);
    return 0;
}

注意,如果我在调用“runFunction(helloWorld)”中输入“helloWorld”,我会收到编译时错误。如果可能的话,我想在Java中使用相同的编译时错误。

3 个答案:

答案 0 :(得分:2)

我担心你不能用Java做到这一点。

然而,在Java中实现这一点的通常方法是定义一个接口,该接口只声明一个方法,即你想要“作为参数传递”的方法,并在类中实现它。您的类必须实现您感兴趣的方法。当您想要将“引用”传递给方法时,实际上是传递了接口的实例。你可以在上面调用你的方法。

一个例子可以解释这个:

interface Something {
    void doSomething();
}

class HelloWorld {
    void doSomething() {
        System.out.println("Hello world");
    }
}

class Main {

    void runFunc(Something s) {
        s.doSomething();
    }

    public static void main(String... args) {
        runFunc(new HelloWorld());
    }

}

问题是,如果你想调用另一个方法,你需要创建一个实现Something的新类

答案 1 :(得分:0)

这在Java中是不可能的:方法不是Java中的一等公民。

但是可以在Scala中完成!

答案 2 :(得分:0)

您可以编写一个注释处理器,它使用JDK中的私有API检查通过反射API调用的方法,偶尔停止编译过程。 这在Compile-Time Checked Reflection API中有详细说明,正如dp4j所做的那样。 如果您将dp4j与@Reflect或JUnit's @Test annotations一起使用,那么当您正常调用方法时,您将获得编译时检查,如myDeclaredMethod(new Arg1Class())