国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在java中利用動態編譯實現eval

2019-11-18 13:37:07
字體:
來源:轉載
供稿:網友

  我們知道,在很多腳本語言中都有eval涵數,它可以把字符串轉換為表態式并執行.如在javascript中

var str = aid.value + ".style.top = 10;"

把一個id為"aid"的控制的值取出來加合并成一個字符串,假如aid的值是"axman",則
str = "axman.style.top = 10"
現在我們要讓控制axman移動到頂部為10的位置:

eval(str);

這樣這個字符串就變成了表達式或語句開始執行.這樣的功能對于動態構造變量是有非常重要的
意義.

那么在java中,假如實現這個功能呢?其實我們可以用動態編譯來實現:

假設有一組方法實現不同的功能,現在要根據傳進來的方法名調用相應的方法,假如沒有eval功能,我們
只能這么做:



MyClass mc = new MyClass();
if(str.equals("m1"))
mc.m1();
else if(str.equals("m1"))
mc.m2();
else if(str.equals("m3"))
mc.m3();
else if(.........)
.........();

假如有一百種情況呢?

假如我們用eval方法就可以直接這樣:

String str = ...........;
eval("mc"+str+"();");

是不是非常方便?要害是如何實現eval()?

我們把要轉換的字符串構造一個完整的類:假如方法是有返回值的.則:

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的語句來執行.

本文只是一個例子,說明了一個動態編譯的思想,更好的實現請各位朋友自己來完成.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滕州市| 开化县| 修文县| 佛坪县| 左贡县| 遂平县| 司法| 岳阳县| 鄂托克旗| 和硕县| 佛学| 乌兰县| 土默特右旗| 富裕县| 余江县| 西宁市| 千阳县| 乐平市| 南陵县| 扶绥县| 宿松县| 咸丰县| 南涧| 和林格尔县| 牟定县| 城口县| 温泉县| 汉阴县| 盱眙县| 阿勒泰市| 景宁| 泽库县| 大田县| 克拉玛依市| 福贡县| 长治市| 烟台市| 绥棱县| 徐汇区| 司法| 柳州市|