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



我想获得一个类似于这样的方法对象:

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

但是!我想在编译时检查方法"myDeclaredMethod"的存在。我实际上不需要动态地选择方法,我只需要一个对它的引用,这样我就可以把它传递给另一个方法…类似于C语言的函数指针。我想这样做:

#include <stdio.h>
void helloWorld() {
    printf("hellon");
}
void runFunction( void (myfunc)() ) {
    myfunc();
}
int main() {
    runFunction(helloWorld);
    return 0;
}

注意,如果我在调用"runFunction(helloWorld)"时错误地键入"helloWorld",我会得到一个编译时错误。如果可能的话,我希望在Java中出现相同的编译时错误。

恐怕你不能在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的新类

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

但是在Scala中是可以做到的!

您可以编写一个注释处理器,它使用JDK中的私有API检查通过反射API调用的方法,并偶尔停止编译过程。这在编译时检查反射API中有详细说明,由dp4j完成。如果您使用dp4j的@Reflect或JUnit的@Test注释,当您"正常"调用方法时,您将获得编译时检查,如myDeclaredMethod(new Arg1Class())

相关内容

  • 没有找到相关文章

最新更新