3


我有一个获取 html 文件内容的应用程序。

假设页面的文本是:

String[] arr = new String[] {"!","@","#"};
for (String str :  arr) {
write(str);
}

我可以以某种方式编译此文本并在我的应用程序中运行代码吗?

谢谢

4

5 回答 5

4

使用贾尼诺。它是一个 java 运行时内存编译器。比BCEL之类的要容易得多。

从主页:

“什么是贾尼诺?

Janino 是一个超小、超快的 Java™ 编译器。它不仅可以像 JAVAC 工具一样将一组源文件编译成一组类文件,还可以在内存中编译一个 Java™ 表达式、块、类体或源文件,加载字节码并直接在相同的JVM。Janino 并非旨在成为开发工具,而是用于运行时编译目的的嵌入式编译器......

于 2012-08-12T20:28:36.467 回答
1

由于问题已标记android

到目前为止发布的答案仅适用于“标准”JVM,不适用于 Android 的 Dalvik VM。原则上,在 Android 上也可以。我不知道是否有可以嵌入的现有 Java 编译器,但您可能会使用dexmaker生成最终的 Dalvik 字节码。可以将现有的 Java 编译器与 dexmaker 结合使用。

但是在尝试这样的事情之前请三思而后行,并且要非常小心。您想要的最后一件事是攻击者在您的用户硬件上执行任意代码的方法。

于 2012-08-12T20:34:32.717 回答
1

您可以使用javac编译器、Java Compiler API 或 BeanShell 库(或类似库)。您可以通过多种方式编译它,没有一种非常简单,这通常会导致寻找另一种方法来解决您的问题。

而不是生成源代码并编译其通用以直接使用 ASM、Javaassist、BCEL 等生成字节码


这似乎与

for(char ch: "!@#".toCharArray())
    write(ch);

这可能与

write("!@#");
于 2012-08-12T20:13:00.310 回答
0

您可以尝试javassist,但它不是完整的 Java。

于 2012-08-12T20:20:56.970 回答
0

这通常并不难做到,但我不得不问您能否详细说明您正在尝试完成的工作。我一直在做这种类型的事情。这只是从用户那里获取信息并在代码的其他地方使用它的另一个示例。由于您使用 java 可能会查看字符串 API http://docs.oracle.com/javase/6/docs/api/java/lang/String.html和字符串标记器http://docs.oracle.com/javase /6/docs/api/index.html?java/lang/package-summary.html

现在,您可以一次将字符串分解为一个单词或其他值的单个值。从那里,您可以使用 float 或 double 类中的 isNAN() 等函数来确定它是数字还是字符串,还是您要测试的任何内容。现在您知道您正在处理什么,您可以以可用的形式重建数据。

如果要将值用作值,请注意值,请使用 Float(string value) 构造函数。即 Float x = new Float(myString)

于 2012-08-12T20:22:32.717 回答