开发者

Dynamic Function Creation in Java

So I'm trying to figure out if there is some method to dynamically create/assign a method to a class in Java. If it were C, I would just do it as follows using pointers:

public class Foo {  

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

};  

int main() {  
  Foo f = new开发者_Go百科 Foo();  
  f.bar({"my function" ...})  
}  

However, Java of course has no pointers, so is there any way to get a similar functionality out of a Java application?


In Java, you would normally declare an interface with a method to be called. For example, if your function simply wants to execute some code, you would declare a Runnable and implement its run method.

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

}


To generate truly dynamic methods you need a bytecode-manipulation library, such as Javassist or cglib.


In java it is achieved by something called anonymous classes, here is an example -

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


You can use the Java Scripting API, create the function as a Script and call it. But only do this if your functions are really completely defineable at runtime, because interpreting scripts is always slower than implementing it in native Java.


If you really want to change classes at runtime, the only way is to actually modify the bytecode, assuming your set-up allows it (Java security would normally kick in). That said, there's an java.lang.instrument package in Java 6 which may help:

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

You might find the cglib project of use also:

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


See http://functionaljava.org/ for a whole functional library for Java.


Here's a link to how you can use the built in runtime version of javac to compile classes you define on the fly.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜