public class LiquorTest {
public static void main(String[] args) throws Exception{
//可以复用(可以,不断的增量编译)
DynamicCompiler compiler = new DynamicCompiler();
String className = "HelloWorld";
String classCode = "public class HelloWorld { " +
" public static void helloWorld() { " +
" System.out.println(\"Hello, world!\"); " +
" } " +
"}";
//可添加多个源码
compiler.addSource(className, classCode);
compiler.build();
//构建后,仍可添加不同类的源码再构建
Class<?> clazz = compiler.getClassLoader().loadClass(className);
clazz.getMethod("helloWorld").invoke(null);
}
}
4、具体差异 - 表达式评估器
比较
Janino
Liquor
缓存
无(可以自己包装)
有二级缓存(类加载器缓存,编译结果缓存)
体验
每次要重新构建
方便
性能
单次更好
缓存命名时,非常好(接近原始 Java 代码性能)
Janino
java复制代码
public class JaninoTest {
public static void main(String[] args) throws Exception {
//每次要新实例化
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.cook("3 + 4");
System.out.println(ee.evaluate());
}
}
Liquor
java复制代码
public class LiquorTest {
public static void main(String[] args) throws Exception {
//单例,可复用,线程安全
System.out.println(Exprs.eval("3 + 4"));
}
}
5、具体差异 - 脚本评估器
比较
Janino
Liquor
缓存
无(可以自己包装)
有二级缓存(类加载器缓存,编译结果缓存)
体验
每次要重新构建
方便
性能
单次更好
缓存命名时,非常好(接近原始 Java 代码性能)
Janino
java复制代码
public class JaninoTest {
public static void main(String[] args) throws Exception {
//每次要新实例化
ScriptEvaluator se = new ScriptEvaluator();
se.cook("System.out.println(\"hello word\");");
se.evaluate();
}
}
Liquor
java复制代码
public class LiquorTest {
public static void main(String[] args) throws Exception {
//单例,可复用,线程安全
Scripts.eval("System.out.println(\"hello word\");");
}
}