- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
如果你只要 Java7 及以下的语法支持,建议 Janino。如果要你想更全的 Java8、Java11、Java17、Java21 等语法,可以选 Liquor.
接口 | Janino | Liquor |
---|---|---|
动态编译器 | SimpleCompiler | DynamicCompiler |
表达式评估器 | ExpressionEvaluator | LiquorEvaluator (Exprs) |
脚本评估器 | ScriptEvaluator | LiquorEvaluator (Scripts) |
动态编译器的性能,基本上可以按“次”计量。次数越多,费时越多。尽量把可知代码,合在一起编译(次数,越少越好).
public class JaninoTest {
public static void main(String[] args) throws Exception {
//此类,不可以复用(可以通过别的方式,实现多类一起编译)
SimpleCompiler compiler = new SimpleCompiler();
String className = "HelloWorld";
String classCode = "public class HelloWorld { " +
" public static void helloWorld() { " +
" System.out.println(\"Hello, world!\"); " +
" } " +
"}";
//只能单个编译
compiler.cook(classCode);
//再 cook ,则会异常
Class<?> clazz = compiler.getClassLoader().loadClass(className);
clazz.getMethod("helloWorld").invoke(null);
}
}
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);
}
}
比较 | Janino | Liquor |
---|---|---|
缓存 | 无(可以自己包装) | 有二级缓存(类加载器缓存,编译结果缓存) |
体验 | 每次要重新构建 | 方便 |
性能 | 单次更好 | 缓存命名时,非常好(接近原始 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());
}
}
public class LiquorTest {
public static void main(String[] args) throws Exception {
//单例,可复用,线程安全
System.out.println(Exprs.eval("3 + 4"));
}
}
比较 | Janino | Liquor |
---|---|---|
缓存 | 无(可以自己包装) | 有二级缓存(类加载器缓存,编译结果缓存) |
体验 | 每次要重新构建 | 方便 |
性能 | 单次更好 | 缓存命名时,非常好(接近原始 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();
}
}
public class LiquorTest {
public static void main(String[] args) throws Exception {
//单例,可复用,线程安全
Scripts.eval("System.out.println(\"hello word\");");
}
}
最后此篇关于Java动态编译工具Janino和Liquor差别的文章就讲到这里了,如果你想了解更多关于Java动态编译工具Janino和Liquor差别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 Janino 来评估脚本,但我不知道如何在脚本中表示值列表 org.codehaus.janino janino
我正在尝试在 logback 配置中使用 janino 条件语句,它与“if”和“else”一起工作正常。但是我想问一下有没有可能在里面写“else if”? 我的情况 -
使用Logback的条件处理来比较Logback XML配置文件中的两个String如下... ...导致以下异常。 14:22:08,315 |-ERROR
我正在尝试使用 scriptella 复制 oracle 的列,我想将它们插入到结合 scriptella 和 janino 的 ArrayList 中,以便稍后使用它们并进行比较, 这是我所做的
我收到错误消息无法在类路径上找到 Janino 库。跳过条件处理。 我应该在类路径中包含什么来解决这个问题(lib 和版本)? 最佳答案 登录requires the Janino library用于
如何使用 janino 编译器将简单的 java 源代码从字符串编译为字节数组中的字节码? 到目前为止,我一直在尝试理解 janino 文档 here (在 SimpleCompiler 下)和 he
我即将开始开发一个小型 Java 桌面应用程序。该应用程序只是一个引擎,用户可以为其提供 Java 类来完成工作(将输入转换为输出)。 我希望用户提供实际的 Java 类作为可以动态加载(和重新加载)
这是触发问题的代码。这里的代码使用janino创建一个编译器。我假设该错误主要与帖子 Java.lang.ClassnotFound 底部的 String 语句有关 //-------------
我正在尝试在 logback 中使用评估器。因此,我的 logback.xml 中有这个片段 logger != null && message != null &&
一个简单的单元测试(没有 junit)给出了奇怪的异常 import java.io.StringReader; import java.sql.PreparedStatement; import o
我正在构建一个使用 Spark 进行基于随机森林分类的应用程序。当尝试运行该程序时,我从该行收到异常:StringIndexerModel labelIndexer = new StringInd
我在 tomcat 8.5.32(最新的 java 8、1.8.0_181)下部署了一个应用程序,使用最新的 logback 1.2.3、janino 3.0.8 和 slf4f 1.7.25。 我的
我是一名优秀的程序员,十分优秀!