- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何使用 janino 编译器将简单的 java 源代码从字符串编译为字节数组中的字节码?
到目前为止,我一直在尝试理解 janino 文档 here (在 SimpleCompiler 下)和 here 关于如何将一个 Java 源代码编译成字节码格式的一个类,但我认为我做得不对。
到目前为止,我的天真的方法如下所示:
private void testJanino() {
String cn = "Arne";
SimpleCompiler sc = new SimpleCompiler();
try {
sc.cook("public class Arne{ public float doWork(){return 42.0f;}}");
InputStream is = sc.getClassLoader().getResourceAsStream(cn);
if (null != is) {
int len = is.available();
byte[] ar = new byte[len];
System.out.println("SZ:" + len);
int r = is.read(ar);
System.out.println("READ:" + r);
} else {
System.out.println("NO IS");
}
} catch (CompileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
输出NO IS
表明我试图错误地使用它。
那么我应该做什么呢?
编辑:我一直在不停地做,但我似乎无法得到我想要的东西。以下是使用 janino UnitCompiler
类的尝试:
private String mClassName = "Arnulf";
private String mCode = "public class " + mClassName + "{ public float doWork(){return 42.0f;}}";
private void testJanino2() {
try {
InputStream is = new ByteArrayInputStream(mCode.getBytes(StandardCharsets.UTF_8));
Scanner s = new Scanner(mClassName, is);
Parser p = new Parser(s);
Java.CompilationUnit compilationUnit = p.parseCompilationUnit();
IClassLoader iClassLoader = new LOLClassLoader(null);
UnitCompiler uc = new UnitCompiler(compilationUnit, iClassLoader);
uc.compileUnit(false, false, false);
} catch (CompileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
其中 LOLClassLoader
是一个简单的“记录一切,不执行任何操作”的类,它扩展了 IClassLoader
。
这最终会出现这样的空指针:
java.lang.NullPointerException
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:429)
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:393)
at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:185)
at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:347)
at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1139)
at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:354)
at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:322)
at com.mypackage.backend.MyServlet.testJanino2(MyServlet.java:60)
at com.mypackage.backend.MyServlet.doPost(MyServlet.java:208)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:491)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
此时欢迎任何帮助或提示。
谢谢!
最佳答案
So what should I be doing instead?
这似乎有效:
private void testJanino() throws Exception {
SimpleCompiler sc = new SimpleCompiler();
sc.cook("public class Arne{ public float doWork(){return 42.0f;}}");
Class<?> arneClass = sc.getClassLoader().loadClass("Arne");
Object arne = arneClass.newInstance();
Method doWork = arneClass.getDeclaredMethod("doWork");
Object result = doWork.invoke(arne, new Object[0]);
System.out.println(result);
}
如果您确实想动态编译一个类,然后能够在流中获取其字节码,请查看 How do you dynamically compile and load external java classes?
关于java - 使用 janino 将 java 源代码从字符串编译为字节数组中的字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121022/
我正在使用 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。 我的
我是一名优秀的程序员,十分优秀!