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] }); //假如方法沒有返回就直接調用 }