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を受け入れるコンストラクタを作成することです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)));
}

元の答え

これについては、JavaDoc からClass#getMethod(String, Class...)

この Class オブジェクトによって表されるクラスまたはインターフェイスの指定されたパブリック メンバー メソッドを反映する Method オブジェクトを返します。

そして、あなたの方法は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から

この Class オブジェクトによって表されるクラスまたはインターフェイスの指定されたパブリック メンバー メソッドを反映する Method オブジェクトを返します。

あなたの方法はprivate、ではありませんpublic

使用できるのは getDeclaredMethod です。

あなたが抱えているもう1つの問題は、このメソッドにはインスタンスが必要であり、それを保存していないように見えることです。

于 2012-06-22T18:35:47.247 に答える