4

そこで、Javaでメソッドを動的に作成/クラスに割り当てるメソッドがあるかどうかを調べようとしています。Cの場合は、ポインターを使用して次のようにします。

public class Foo {  

  void bar(void *ptr) {....}  

};  

int main() {  
  Foo f = new Foo();  
  f.bar({"my function" ...})  
}  

ただし、Javaにはもちろんポインタがないので、Javaアプリケーションから同様の機能を引き出す方法はありますか?

4

7 に答える 7

4

Javaでは、通常、呼び出されるメソッドを使用してインターフェースを宣言します。たとえば、関数が単にコードを実行したい場合は、Runnableを宣言し、そのrunメソッドを実装します。

public class Foo {
    void bar(Runnable function) {
       for(int i = 0; i < 5; i++) {
           function.run();
       }
    }

    static void myFunction() {
         System.out.println("my Function!");
    }

    public static void main(String[] ignored) {
         Foo f = new Foo();
         f.bar( new Runnable() { public void run() {
             myFunction();
         }});
    }

}
于 2011-03-15T16:45:36.380 に答える
2

真に動的なメソッドを生成するには、Javassistcglibなどのバイトコード操作ライブラリが必要です。

于 2011-03-15T16:48:29.620 に答える
1

Javaでは、匿名クラスと呼ばれるものによって実現されます。ここに例を示します-

abstract class Bar {
    public void myfunc();
}

public class Client {

    public void execute()
    {
        doSomething(new Bar() {
            // define your dynamic function here ie provide its implementation
            public void myfunc() {
                //do whatever
            }
        });
    }

    public void doSomething(Bar b)
    {
        b.myfunc();
    }
}
于 2011-03-15T16:54:25.120 に答える
0

Java Scripting APIを使用して、関数をスクリプトとして作成し、呼び出すことができます。ただし、スクリプトの解釈はネイティブJavaでの実装よりも常に遅いため、実行時に関数が本当に完全に定義可能である場合にのみこれを行ってください。

于 2011-03-15T16:48:15.830 に答える
0

実行時にクラスを本当に変更したい場合、唯一の方法は、セットアップで許可されていると仮定して、実際にバイトコードを変更することです(通常、Javaセキュリティが有効になります)。そうは言っても、Java6には次のようなjava.lang.instrumentパッケージがあります。

http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

使用するcglibプロジェクトも見つかるかもしれません:

http://sourceforge.net/projects/cglib/

于 2011-03-15T16:49:53.503 に答える
0

Javaの機能ライブラリ全体については、http://functionaljava.org/を参照してください。

于 2011-03-15T16:51:07.807 に答える
0

組み込みのランタイムバージョンのjavacを使用して、定義したクラスをその場でコンパイルする方法へのリンクを次に示します。

于 2011-03-15T17:01:07.490 に答える