2009-07-09 1 views
1

私はC++とPythonでこれを行うことができますが、私はそれをJavaで分かりません。ネットワークメッセージでユーザーのJavaメソッドを実行する

私のクラスは、メッセージが入ったときに私のネットワークループが実行する 'MessageReceived'関数を持っています。ユーザが自分のクラスでMessageReceivedで実行したいメソッドを書くことができるようにします。 Javaでメソッドを渡して実行する方法を理解していないクラスを継承してMessageReceivedをオーバーライドすることで回避することができますが、ユーザーに強制するのを避けることができると期待しています。

+0

コードサンプルをいくつか教えてもらえますか?多分Class.forName()とReflectionが役立つでしょうか? – akarnokd

+0

コールバック関数について質問していますか? –

答えて

2

あなたはメッセージを受信したときに他のオブジェクトが通知されることを可能にするためのObserver Patternをしたいと思います。

あなたが本当に尋ねていることやあなたの持つ問題は明確ではありません。それはデザインか、実際にユーザーが書いたクラスを読み込んでいるのか、それともユーザークラスを動的に構成しているのでしょうか?

1

最も簡単な方法は、呼び出すメソッドを定義するインターフェイスを作成することです。そうすれば、メソッド名を知っているので、いつでもReflection経由でメソッドを実行できます。

あなたが言っていることは「eval」と呼ばれ、Javaには関数型言語のような評価を実行する能力はありません。

リフレクションを使用して愚かな例:

  String classname = "MyClass"; 
    Class klass = Class.forName(classname); 
    Class paramTypes[] = {Integer.TYPE, Float.TYPE}; 
    Method method = klass.getMethod("methodToRun", paramTypes); 
    method.invoke(new Integer(1), new Float(1.2f)); 
+0

Method.invokeでは、パラメータだけでなく、メソッドを呼び出すはずのインスタンスが必要です。 – Yishai

-1

"閉鎖"機能を探しているようですが、 つまり、関数を変数として渡すことができます。

http://en.wikipedia.org/wiki/Closure_(computer_science)

Javaは現在、それまでのJava 7

に追加するための提案がありますが、あなたはjava.util.Callableの実装では、ユーザのパスを持っている可能性があり、これを持っていませんこれは基本的に1つのメソッドの周りのラッパークラスです。

0

これにはいくつかの方法があります。もっと伝統的なJavaの方法は、渡される任意のメソッドを持つのではなく、メソッド定義と定義されたインタフェースです。このようにして、クラスはインターフェイスの実装を受け取り、オブジェクトのメソッドを呼び出します。

もう1つは、メソッドが呼び出されるはずのオブジェクトのインスタンスと共にMethodオブジェクトを渡すことです。これは、シリアル化されていない(メソッドがシリアライズ可能ではない)場合にはうまく動作しますが、他の言語ほど優雅ではありません。もちろん、メソッドとインスタンスを保持する独自のラッパークラスを作成することもできますが、同じインターフェイスタイプのソリューションに戻ることができます。

関連する問題