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

來源:互聯網
上載者:User
我們知道,在很多指令碼語言中都有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的語句來執行.

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.