在运行时从Java编译和使用Groovy类?
我有一个应用程序,我希望通过让用户在Groovy中定义类,最终实现一些接口来实现可扩展性。
关键方面是应该在运行时解释/编译它。 即我需要我的应用程序来获取.groovy
并编译它。 在启动过程中这样做是可以的。
然后,当然,我的应用程序应该能够实例化该类。
我看到两个解决方案:
1)在应用程序运行时编译,将类放在类路径上的某个地方,然后加载类,假装它们始终存在。
2)一些更聪明的方法 – 调用编译器API和一些类加载魔法让我的系统类加载器看到它们。
我如何选择2)?
还有其他想法吗?
看看将Groovy集成到应用程序中
- 获取类加载器
- 加载类
- 实例化类。
美女 : –
由于.groovy
编译为.class
字节码,解析该类会给你一个Class
的instanceof
。 现在它变成了所有JAVA世界,唯一的区别,一旦你在实例化后得到了GroovyObject
,你可以根据需要调用方法。
编辑:就这样它包含在这里:
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());
和
package org.jboss.loom.migrators.mail; import org.jboss.loom.tools.groovy.IFoo; public class Foo implements IFoo { public String foo(){ return "Foooooooooo Action!"; } }