首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于Java 5和Java 6的即时内存Java代码编译

用于Java 5和Java 6的即时内存Java代码编译
EN

Stack Overflow用户
提问于 2018-03-05 05:02:07
回答 2查看 0关注 0票数 0

如何在Java 5和Java 6中从任意字符串(在内存中)编译Java代码,加载它并在其上运行特定方法(预定义)?

在你点燃之前,我查看了现有的实现:

  • 大多数依赖于Java 6编译器API。
  • 那些不依赖于技巧的人。
  • 是的,我检查了commons-jci。要么我太密集而不了解它是如何工作的,要么就是没有。
  • 我无法找到如何提供编译器当前的类路径(这是相当巨大的)。
  • 在工作的实现上(在Java 6中),我找不到如何正确加载内部类(或内部匿名类)。
  • 如果整个事件都在内存中,我会非常喜欢它,因为它在多个环境中运行。

我确信之前已经解决了这个问题,但我找不到任何在谷歌上看起来甚至达到半生产质量的东西(除了jci,正如我之前所说的,我没有设法使用它)。

编辑:

  • 我查看了JavaAssist - 我需要内部类,Java 5.0语言级别的支持和编译整个类路径。另外,我想立即创建新的课程。我可能会误解,但我无法找到如何在JavaAssit中执行此操作。
  • 我愿意使用基于文件系统的解决方案(调用javac),但我不知道如何去描述类路径,也不知道如何使用一个特殊的类加载器加载文件(这些文件不在我的类路径中)回收多个调用。虽然我知道如何研究它,但我更喜欢现成的解决方案。

Edit2:现在,我满足于BeanShell“评估”。显然,它做了我所需要的一切(获得一个字符串,并在'当前'类路径中对其进行评估。它确实遗漏了Java 5的一些特性,但它可以使用枚举(不定义)和编译'generic' )类,所以它应该足够我想要的。

EN

回答 2

Stack Overflow用户

发布于 2018-03-05 13:33:03

如果你不是完全依赖于编译,像Beanshell,groovy和其他脚本语言的解决方案很容易嵌入(事实上,Java内置支持插入脚本语言,所以你的代码甚至不知道什么语言该脚本被写入)

Beanshell应该运行任何100%的Java代码IIRC,我相信Groovy可以运行大多数Java代码 - 可能都是。

票数 0
EN

Stack Overflow用户

发布于 2018-03-05 14:46:44

JCI看起来不错。这段代码应该是你的基础:

代码语言:javascript
复制
JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");

MemoryResourceReader mrr = new MemoryResourceReader();
mrr.add("resource name string", yourJavaSourceString.getBytes());

MemoryResourceStore mrs = new MemoryResourceStore();

CompilationResult result = compiler.compile(sources, mrr, mrs);

// don't need the result, unless you care for errors/warnings
// the class should have been compiled to your destination dir

添加一个MemoryResourceStore将编译后的类输出发送到内存,就像请求。

此外,设置javac你的情况设置,如类路径,可以通过完成setCustomArguments(String[] pCustomArguments)JavacJavaCompilerSettings类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档