Is Compiling String as code possible?

做~自己de王妃 提交于 2021-02-07 19:41:53

问题



I have an app that gets the content of an html file.

Lets say the text of the page is:

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

Can I somehow compile this text and run the code within my app?

Thanks


回答1:


Use Janino. It's a java runtime in-memory compiler. Way easier than BCEL and the likes.

From the homepage:

"What is Janino?

Janino is a super-small, super-fast Java™ compiler. Not only can it compile a set of source files to a set of class files like the JAVAC tool, but also can it compile a Java™ expression, block, class body or source file in memory, load the bytecode and execute it directly in the same JVM. Janino is not intended to be a development tool, but an embedded compiler for run-time compilation purposes...




回答2:


You can use the javac compiler, or the Java Compiler API or the BeanShell library (or similar). You can compile it any number of ways, none terribly simple which often leads to finding another way to solve your problem.

Instead of generating source and compiling its common to generate byte code directly using ASM, Javaassist, BCEL or the like


This appears to be the same as

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

which is likely to be the same as

write("!@#");



回答3:


Since the question is tagged android:

The answers posted so far only apply to the “standard” JVM, not to Android's Dalvik VM. In principle, it is possible on Android too. I don't know if there's an existing Java compiler that you can embed, but you would probably generate the final Dalvik bytecode using dexmaker. It may be possible to combine an existing Java compiler with dexmaker.

But please think twice before attempting anything like this, and be very careful. The last thing you want is a way for an attacker to execute arbitrary code on your user's hardware.




回答4:


You can try javassist, it's not full Java though.




回答5:


This is not usually that hard to do, but I have to ask can you give more detail on exactly what it is you are trying to accomplish. I do this type thing all the time. This is just another example of getting information from the user and using it somewhere else in your code. Since your using java maybe look at the string API http://docs.oracle.com/javase/6/docs/api/java/lang/String.html and the string tokenizer http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/package-summary.html

Now you can break the string down into single values one word or other value at a time. From there you can use functions such as isNAN() from the float or double class to determine if it a number or string or whatever it is your testing for. Now you know what you’re dealing with you can reconstructed the data in a usable form.

Note for values if you want to use them as values use Float(string value) constructor. i.e Float x = new Float(myString)



来源:https://stackoverflow.com/questions/11925497/is-compiling-string-as-code-possible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!