2011-08-05 6 views
4

は次のようにオブジェクト:(Javaで)チェックをコンパイル時にクラスのメソッドオブジェクトを取得

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

しかし!メソッド "myDeclaredMethod"の存在をコンパイル時にチェックしたいと思います。私は実際にメソッドを動的に選択する必要はありません、私は別のメソッドに渡すことができるように、私はちょうどそれへの参照が必要です... Cの関数ポインタを持っている方法に似ています。私はコール「runFunction(のhelloWorld)」の「のhelloWorld」を間違えた場合、私はコンパイル時のエラーを取得し、

#include <stdio.h> 

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

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

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

注意:私はこのような何かをしたいと思います。可能であれば、Javaで同じコンパイル時エラーが欲しいです。

答えて

2

私はJavaでこれを行うことはできません。

しかし、これをJavaで実現する一般的な方法は、「引数として渡したい」メソッドを宣言し、それをクラスに実装するインタフェースを定義することです。あなたのクラスはあなたが興味のあるメソッドを実装しなければなりません。メソッドへの "参照"を渡すときは、実際にあなたのインタフェースのインスタンスを渡します。その上でメソッドを呼び出すことができます。あなたはあなたがプライベート使用して注釈プロセッサを書くことができSomething

+0

質問に簡潔に回答し、代替手段を提供してくれてありがとう。私は、このコンテキストのインターフェイスは私を助けるつもりはないので、別の選択肢があったと思います...私は(可能な限り単純な方法で)メインスレッドからメソッドを呼び出して、別のスレッドで実行させようとしています。これまでのベストは、キューを使用してメソッド名を文字列として渡すことです。これは、私が2番目のスレッドで呼び出すかもしれない約半ダースのメソッドがあり、コード内で半ダースの場所で繰り返さなければならない5行のソリューションが欲しくないので、私が持っている最高のものです。 – Jason

+0

@Vivienなぜ 'HelloWorld'が' interface Something'を実装していないのか分かりませんが、コンパイルエラーが発生しませんか?ありがとう。 –

0

これはJavaでは不可能です。メソッドはJavaの一流の市民ではありません。

しかし、Scalaでも可能です!

+0

のように、「通常」のメソッドを呼び出すと、コンパイル時のチェックが行われます。ただし、メソッドはC++のファーストクラスの市民ではない(つまり、オブジェクトではない)ことを指摘したい。引数としてメソッド名の時間チェックをコンパイルすることができる。その答えの一部は、メソッド呼び出しの引数としてメソッド名のコンパイル時間チェックの欠如の理由ではありません。 – Jason

0

を実装する新しいクラスを作成する必要があり、別のメソッドをコールする場合の問題は、ある

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()); 
    } 

} 

の例では、このことを説明するかもしれませんJDKのAPIは、リフレクションAPIを介して呼び出されるメソッドをチェックし、時折コンパイルプロセスを停止します。 詳細はCompile-Time Checked Reflection APIで、dp4jと同様です。 @ReflectまたはJUnit's @Test annotationsでdp4jを使用する場合、myDeclaredMethod(new Arg1Class())

+0

いいですね。私はリンクをたどってコンパイルして、時間を確認した反射APIを見つけました。私が見つけたはずのものがわからない、コンテンツ付きのものへのリンクを投稿できますか? – Jason

+0

もう一度チェック - 記事が公開されました。 – simpatico

関連する問題