Java中的动态函数创建

时间:2011-03-15 16:42:05

标签: java methods java-6

所以我试图弄清楚是否有一些方法可以动态创建/为Java中的类分配方法。如果它是C,我只需使用指针进行如下操作:

public class Foo {  

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

};  

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

然而,Java当然没有指针,所以有没有办法从Java应用程序中获得类似的功能?

7 个答案:

答案 0 :(得分: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();
         }});
    }

}

答案 1 :(得分:2)

要生成真正动态的方法,您需要一个字节码操作库,例如Javassistcglib

答案 2 :(得分: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();
    }
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果你真的想在运行时更改类,唯一的方法是实际修改字节码,假设你的设置允许它(Java安全性通常会启动)。也就是说,Java 6中有一个java.lang.instrument包可能会有所帮助:

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

您可能还会找到使用的cglib项目:

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

答案 5 :(得分:0)

有关Java的完整功能库,请参阅http://functionaljava.org/

答案 6 :(得分:0)

这里有link如何使用内置运行时版本的javac来编译你动态定义的类。