2

我正在尝试将一个方法作为参数传递给另一个类中的方法。该方法在第一个类中定义,另一个类的方法是静态的。看到它会更容易理解:

设置

public class MyClass extends ParentClass {
    public MyClass() {
        super(new ClickHandler() {
            public void onClick(ClickEvent event) {
                try {
                    OtherClass.responseMethod(MyClass.class.getMethod("myMethod",Boolean.class));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void myMethod(Boolean success) {
        if(success.booleanValue()) {
            //do stuff
        }
    }
}

但是,当我尝试构建时,出现以下错误:

错误

The method getMethod(String, Class<boolean>) is undefined for the type Class<MyClass>

问题不在于它没有找到myMethod,它没有找到Class<MyClass>.getMethod,我不知道为什么。

更新

我们已经重新编写了这部分代码,并且没有使用“getMethod orgetDeclaredMethod”。由于 npe 发现我正在做的事情存在一些问题,并且付出了很多努力来寻找答案,所以我接受了这个答案。

4

2 回答 2

5

更新 2

编译时错误表明您正在使用 Java 1.4 编译该类。现在,在 Java 1.4 中,将数组参数定义为 是非法的Type...,您必须将它们定义为Type[],这就是getMethod为 定义 的方式Class

Method getMethod(String name, Class[] parameterTypes)

因此,您不能使用简化的 1.5 语法并编写:

MyClass.class.getMethod("myMethod",boolean.class));

你需要做的是:

MyClass.class.getMethod("myMethod",new Class[] {boolean.class}));

更新 1

您发布的代码由于另一个原因无法编译:

super(new ClickHandler() {

    // This is anonymous class body 
    // You cannot place code directly here. Embed it in anonymous block, 
    // or a method.

    try {
        OtherClass.responseMethod(
            MyClass.class.getMethod("myMethod",boolean.class));
    } catch (Exception e) {
        e.printStackTrace();
    }
});

你应该做的是创建一个ClickHander接受 a 的构造函数Method,像这样

public ClickHandler(Method method) {

    try {
        OtherClass.responseMethod(method);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

然后,在MyClass构造函数中像这样调用它:

public MyClass() {
    super(new ClickHandler(MyClass.class.getMethod("myMethod",boolean.class)));
}

原始答案

更重要的是,来自 JavaDocClass#getMethod(String, Class...)

返回一个 Method 对象,该对象反映此 Class 对象表示的类或接口的指定公共成员方法。

而你的方法是private,不是public

如果您想访问私有方法,您应该使用Class#getDeclaredMethod(String, Class...)并通过调用setAccessible(true).

于 2012-06-22T18:33:49.380 回答
1

问题是您的代码无法编译

new ClickHandler() {
   // not in a method !!
        try {
            OtherClass.responseMethod(MyClass.class.getMethod("myMethod",boolean.class));
        } catch (Exception e) {
            e.printStackTrace();
        }

我假设 ClickHandler 有一个您应该定义的方法,并且您需要将此代码移至该方法。在任何情况下,您都不能将此代码放在方法或初始化程序块之外。


getMethod

返回一个 Method 对象,该对象反映此 Class 对象表示的类或接口的指定公共成员方法。

你的方法是private,不是public

你可以使用的是getDeclaredMethod。

您遇到的另一个问题是此方法需要一个实例,而您似乎并未存储该实例。

于 2012-06-22T18:35:47.247 回答