java怎么把一段字符串当做代码来执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java怎么把一段字符串当做代码来执行相关的知识,希望对你有一定的参考价值。

javascript中eval()可以实现字符串转代码,java中需要使用动态编译。
把获得的字符串写入一个临时文件中,然后编译它,在调用其中的函数。
我们把要转换的字符串构造一个完整的类:如果方法是有返回值的.则:

public object eval(string str)
//生成java文件
string s = "class temp";
s += "object rt()"
s += "myclass mc = new myclass();"
s += " return mc."+str+"();";
s += ""
s +="";
file f = new file("temp.java");
printwriter pw = new printwriter(new filewriter(f));
pw.println(s);
pw.close();
//动态编译
com.sun.tools.javac.main javac = new com.sun.tools.javac.main();
string[] cpargs = new string[] "-d", "所在目录","temp.java";
int status = javac.compile(cpargs);
if(status!=0)
system.out.println("没有成功编译源文件!");
return null;

//调用temp的rt方法返回结果:
myclassloader mc = new myclassloader();
class clasz = mc.loadclass("test.class",true);
method rt = clasz.getmethod("rt", new class[] string[].class );
return rt.invoke(null, new object[] new string[0] );
//如果方法没有返回就直接调用


我们可以先写好多个重载的eval,有返回值和没有返回值的.以及可以传递参数的.

这样我们就可以用字符串转换为java的语句来执行.
参考技术A 你的问题其实就是java的动态代码运行问题,以下是解答。
有些情况下,我们不得不动态运行Java代码,以便提供更加灵活的方式,以下代码可参考(在JDK 1.5+平台上运行通过):

public static void main(String[] args)
int i = 10;
String code = "System.out.println(\"Hello World!\"+(13+2*5/3));";
code += "for(int i=0;i<" + i + ";i++)";
code += " System.out.println(Math.pow(i,2));";
code += "";
try
run(code);
catch (Exception e)
e.printStackTrace();



private synchronized static File compile(String code) throws Exception
File file = File.createTempFile("JavaRuntime", ".java", new File(System.getProperty("user.dir")));
file.deleteOnExit();
// 获得类名
String classname = getBaseFileName(file);
// 将代码输出到文件
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println(getClassCode(code, classname));
out.close();
// 编译生成的java文件
String[] cpargs = new String[] "-d",
System.getProperty("user.dir") + "\\WebRoot\\WEB-INF\\classes",
file.getName() ;
int status = Main.compile(cpargs);

if (status != 0)
throw new Exception("语法错误!");

return file;



private static synchronized void run(String code) throws Exception
String classname = getBaseFileName(compile(code));
new File(System.getProperty("user.dir")
+ "\\WebRoot\\WEB-INF\\classes\\" + classname + ".class")
.deleteOnExit();
try
Class cls = Class.forName(classname);
Method main = cls.getMethod("method", null);
main.invoke(cls, null);
catch (Exception se)
se.printStackTrace();



private static String getClassCode(String code, String className)
StringBuffer text = new StringBuffer();
text.append("public class " + className + "\n");
text.append(" public static void method()\n");
text.append(" " + code + "\n");
text.append(" \n");
text.append("");
return text.toString();


private static String getBaseFileName(File file)
String fileName = file.getName();
int index = fileName.indexOf(".");
String result = "";
if (index != -1)
result = fileName.substring(0, index);
else
result = fileName;

return result;

javascript 中拼接字符串,如何把一段代码拼接起来

ahtml="<script>"+
"var rs1 = new SimpleResize(dragDiv"+obj.name+");"+
"rs1.Set(rRightDown"+obj.name+", 'right-down');"+
"rs1.Set(rLeftDown"+obj.name+", 'left-down');"+
"rs1.Set(rRightUp"+obj.name+", 'right-up');"+
"rs1.Set(rLeftUp"+obj.name+", 'left-up');"+
"rs1.Set(rRight"+obj.name+", 'right');"+
"rs1.Set(rLeft"+obj.name+", 'left');"+
"rs1.Set(rUp"+obj.name+", 'up');"+
"rs1.Set(rDown"+obj.name+", 'down');"+
"</script>";
这样写不对,请高手指教,该如何拼接?

你好,javascript中字符串的拼接使用的是+号连接操作符,另外操作字符串的方法有

字符串其他的调用方法:
s.charAt(0); //第一个字符:“H”
s.charAt(s.length-1); //最后一个字符串“d”
s.substring(1,4); //第2~4个字符串注意不是第2~5个字符串 “ell”;
s.slice(1,4); // 同上 “ell”;
s.replace("H","h"); //“h”替换“H”,全文字符替换,
s.toUpperCase(); //全文大写

s.slice(-3); //最后三个字符“rld”;
s.indexOf("l"); //字符l首次出现的位置; “2”
s.lastIndexOf("l"); //字符l最后出现的位置; “10”
s.indexOf("l",3); //在位置33及之后首次出现字符串了的位置 “3”
s.split(", "); //[“hello”,“world”]分割成子串
合理使用这些方法可以提高操作效率
参考技术A ahtml="<script>"+
"var rs1 = new SimpleResize(dragDiv"+obj.name+");"+
"rs1.Set(rRightDown"+obj.name+", 'right-down');"+
"rs1.Set(rLeftDown"+obj.name+", 'left-down');"+
"rs1.Set(rRightUp"+obj.name+", 'right-up');"+
"rs1.Set(rLeftUp"+obj.name+", 'left-up');"+
"rs1.Set(rRight"+obj.name+", 'right');"+
"rs1.Set(rLeft"+obj.name+", 'left');"+
"rs1.Set(rUp"+obj.name+", 'up');"+
"rs1.Set(rDown"+obj.name+", 'down');"+
"</“ + ”script>";本回答被提问者采纳
参考技术B 考点有两个:
JavaScript的字符串连接机制。

NEWS.length需要缓存,不然每次循环都要重新计算一次length

===============
主要看一下第一个:
在js里字符串一旦赋值后不能修改。

基于这个背景看一下字符串连接操作:
var str ;
str = 'this is a string';
str = str + ',another string.';
对于这个连接操作JS的处理机制是:新建一个临时字符串,将新字符串赋值为 str + ',another string.' ,然后返回这个新字符串并同时销毁原始字符串。所以字符串的连接效率较低。提高效率的办法是用数组的join函数
var tempArr = [] ,src,res;
src = 'this is a string';
tempArr.push(src);
tempArr.push(',another string.');
res = tempArr.join('');

不过在《JavaScript高级程序设计》里也提到:
这个过程是在后台发生的,而这也是在某些旧版本的浏览器(例如版本低于1.0的FireFox、IE6等)中拼接字符串是速度很慢的原因。但这些浏览器后来的版本已经解决了这个问题。
所以效率提高也只是在IE6 等低版本的浏览器中有效。
参考技术C 你在后面加一行alert(ahtml)自己看一下拼完的代码不就知道哪错了么追问

代码没错 就是拼接的方法错了 “” 这个地方是这样拼接吗?

追答

以上是关于java怎么把一段字符串当做代码来执行的主要内容,如果未能解决你的问题,请参考以下文章

javascript 中拼接字符串,如何把一段代码拼接起来

Java中怎么把一个回车键当做字符输入

如何把一段字符串转对应的32位的整数来唯一标识,就如Hash一样

在delphi里怎么快速将一段代码加成注释?

如何把一段逗号分割的字符串转换成一个数组?

java基础面试题:如何把一段逗号分割的字符串转换成一个数组? String s = "a" +"b" + "c" + "d&qu