Groovy:将动态编译的类写入光盘
在我的应用程序中,我需要在运行时编译类/脚本 作为Groovy:将动态编译的类写入光盘,groovy,classloader,dynamic-class-loaders,Groovy,Classloader,Dynamic Class Loaders,在我的应用程序中,我需要在运行时编译类/脚本 作为类: Class<? extends LoginAdapter> clazz = groovyClassLoader.loadClass name LoginAdapter la = clazz.newInstance id, logo 两种方法都很有魅力 现在,我需要能够将编译后的类/脚本写入一些持久性存储(光盘),然后在不从头编译的情况下恢复它们 如何做到这一点?对于可能感兴趣的人,这是我的编程kata: class Base
类
:
Class<? extends LoginAdapter> clazz = groovyClassLoader.loadClass name
LoginAdapter la = clazz.newInstance id, logo
两种方法都很有魅力
现在,我需要能够将编译后的类/脚本写入一些持久性存储(光盘),然后在不从头编译的情况下恢复它们
如何做到这一点?对于可能感兴趣的人,这是我的编程kata:
class Base {
String answer() { null }
String question() { 'WHAT IS.... ?' }
}
序列化应该会有所帮助。然而,从您的示例中不清楚要存储什么:类还是实例。您想如何重用存储的对象?@daggett我想存储该类。第二个例子也可以重新安排成一个类。理论上,您可以扩展GroovyClassLoader并重写createCollector,该createCollector用于从一个源中收集inmemory编译的类。此方法中还有CompilationUnit,它实际上是执行编译的,并且具有getClasses()方法,该方法返回具有getBytes()方法的GroovyClass列表。。。但对我来说,使用groovyc运行编译更容易。@daggett谢谢你的提示!
groovyc
能否以编程方式运行?groovyc启动org.codehaus.groovy.tools.FileSystemCompiler
。检查一下。
class Base {
String answer() { null }
String question() { 'WHAT IS.... ?' }
}
class ClazzSpec extends Specification {
def "test compile"() {
given:
String packageName = 'some.pckg'
String body = """
package $packageName
class SomeClass extends Base {
Closure cl = { a -> println a }
@Override String answer(){ '42' }
String json( m ){ JsonOutput.toJson( m ) }
String longOne( int times ){
times.times{ sleep 100 }
'done'
}
}
"""
CompilerConfiguration cc = new CompilerConfiguration( targetDirectory:new File( './out' ) )
ImportCustomizer imp = new ImportCustomizer()
imp.addStarImports 'groovy.json', Base.package.name
cc.addCompilationCustomizers imp, new ASTTransformationCustomizer( value:1, TimedInterrupt )
new Compiler( cc ).compile packageName + '.SomeClass', body
File base = new File( './out' )
GroovyClassLoader gcl = new GroovyClassLoader()
gcl.addClasspath './out'
Class clazz = gcl.loadClass 'some.pckg.SomeClass'
when:
def inst = clazz.newInstance()
then:
inst.question() == 'WHAT IS.... ?'
inst.answer() == '42'
inst.json( [ q:42 ] ) == '{"q":42}'
inst.longOne( 2 ) == 'done'
when:
inst.longOne 11
then:
thrown TimeoutException
}
}