简体   繁体   中英

Compiling and using Groovy classes from Java at runtime?

I have an app which I'd like to make extensible by letting users define classes in Groovy, eventually implementing some interfaces.

The key aspect is that it should be interpreted/compiled at runtime. Ie I need my app to take the .groovy and compile it. Doing it during boot is ok.

Then, of course, my app should be able to instantiate that class.

I see two solutions:

1) Compile while the app runs, put the classes somewhere on classpath, and then just load the classes, pretending they were always there.

2) Some smarter way - calling a compiler API and some classloading magic to let my system classloader see them.

How would I do option 2)?
Any other ideas?

Have a look at Integrating Groovy into applications

  • Get class Loader
  • Load class
  • Instantiate class.

Beauty :-
Since .groovy compiles to .class bytecode, parsing the class would give you an instanceof Class . Now it becomes all JAVA world, only difference, once you get hold of GroovyObject after instantiatiation, you play around invoking methods on demand.

Edit: Just so it's contained here:

InputStream groovyClassIS = GroovyCompiler.class
     .getResourceAsStream("/org/jboss/loom/tools/groovy/Foo.groovy");

GroovyClassLoader gcl = new GroovyClassLoader();
Class clazz = gcl.parseClass(groovyClassIS, "SomeClassName.groovy");
Object obj = clazz.newInstance();
IFoo action = (IFoo) obj;
System.out.println( action.foo());

and

package org.jboss.loom.migrators.mail;

import org.jboss.loom.tools.groovy.IFoo;

public class Foo implements IFoo {
    public String foo(){
        return "Foooooooooo Action!";
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM