编译字符串是否可能代码?

时间:2012-08-12 20:05:50

标签: java android compilation


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

让我们说该页面的文字是:

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

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

由于

5 个答案:

答案 0 :(得分:4)

使用Janino。它是一个java运行时内存编译器。比BCEL和喜欢的方式更容易。

从主页:

“Janino是什么?

  

Janino是一款超小型超高速Java™编译器。它不仅可以将一组源文件编译为一组类文件(如JAVAC工具),还可以在内存中编译Java™表达式,块,类主体或源文件,加载字节码并执行它直接在同一个JVM中。 Janino不是一个开发工具,而是一个用于运行时编译目的的嵌入式编译器......

答案 1 :(得分:1)

您可以使用javac编译器,Java编译器API或BeanShell库(或类似的)。你可以用任何方式编译它,没有一个非常简单,往往导致找到另一种方法来解决你的问题。

而不是使用ASM,Javaassist,BCEL等直接生成源代码并编译其公共代码来生成字节代码


这似乎与

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

可能与

相同
write("!@#");

答案 2 :(得分:1)

由于问题已标记为android

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

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

答案 3 :(得分:0)

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

答案 4 :(得分: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(字符串值)构造函数。即Float x = new Float(myString)