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 安全通常会启动)。也就是说,java.lang.instrumentJava 6 中有一个包可能会有所帮助:

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

您可以使用 Java Scripting API,将函数创建为脚本并调用它。但只有在你的函数在运行时完全可定义时才这样做,因为解释脚本总是比在本机 Java 中实现它要慢。

于 2011-03-15T16:48:15.830 回答
0

这是一个链接,您可以使用 javac 的内置运行时版本来编译您动态定义的类。

于 2011-03-15T17:01:07.490 回答