Reputation: 490
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 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?
Upvotes: 4
Views: 22004
Reputation: 38521
Here's a link to how you can use the built in runtime version of javac to compile classes you define on the fly.
Upvotes: 0
Reputation: 8036
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();
}
}
Upvotes: 1
Reputation: 36229
See http://functionaljava.org/ for a whole functional library for Java.
Upvotes: 0
Reputation: 7597
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/
Upvotes: 0
Reputation: 86764
To generate truly dynamic methods you need a bytecode-manipulation library, such as Javassist or cglib.
Upvotes: 2
Reputation: 28074
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.
Upvotes: 0
Reputation: 74750
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();
}});
}
}
Upvotes: 4