动态调用方法实例
2004-12-24 09:40
561 查看
import java.io.*;
import java.lang.reflect.Method;
import com.sun.tools.javac.*;
public class MyClass {
private static Main javac = new Main();
public static void main(String[] args) throws Exception {
String str = "";
MyClass mc = new MyClass();
DataInputStream bd = new DataInputStream(System.in);
byte[] brray = new byte[200];
int i = bd.read(brray);
str = new String(brray, 0, i);
//eval(str);
eval("mc" + str + "();");
}
public static Object eval(String str) throws Exception {
//生成java文件
String s = "class Temp{";
s += "public static void main(String[] args) throws Exception{";
s += "test.MyClass mc = new test.MyClass();";
//s += str;
s += "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",
System.getProperty("user.dir") + "/src/test", "Temp.java" };
int status = javac.compile(cpargs);
if (status != 0) {
System.out.println("沒有成功編譯原始檔案!");
return null;
}
//調用Temp的main方法返回結果:
Class clasz = Class.forName("Temp");
Method main = clasz.getMethod("main", new Class[] { String[].class });
return main.invoke(null, new Object[] { new String[0] });
//如果方法沒有返回就直接調用
}
public Object mc1() {
Object obj = "str";
System.out.print("mc1");
return obj;
}
void mc2() {
System.out.print("mc2");
}
}
import java.lang.reflect.Method;
import com.sun.tools.javac.*;
public class MyClass {
private static Main javac = new Main();
public static void main(String[] args) throws Exception {
String str = "";
MyClass mc = new MyClass();
DataInputStream bd = new DataInputStream(System.in);
byte[] brray = new byte[200];
int i = bd.read(brray);
str = new String(brray, 0, i);
//eval(str);
eval("mc" + str + "();");
}
public static Object eval(String str) throws Exception {
//生成java文件
String s = "class Temp{";
s += "public static void main(String[] args) throws Exception{";
s += "test.MyClass mc = new test.MyClass();";
//s += str;
s += "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",
System.getProperty("user.dir") + "/src/test", "Temp.java" };
int status = javac.compile(cpargs);
if (status != 0) {
System.out.println("沒有成功編譯原始檔案!");
return null;
}
//調用Temp的main方法返回結果:
Class clasz = Class.forName("Temp");
Method main = clasz.getMethod("main", new Class[] { String[].class });
return main.invoke(null, new Object[] { new String[0] });
//如果方法沒有返回就直接調用
}
public Object mc1() {
Object obj = "str";
System.out.print("mc1");
return obj;
}
void mc2() {
System.out.print("mc2");
}
}
相关文章推荐
- asp.net 中静态方法和动态方法调用的区别实例分析
- Java 反射机制运用实例(动态调用类的方法)
- c#动态调用Webservice的两种方法实例
- [c#美味] 使用反射动态创建实例并调用方法
- Java反射根据不同方法名动态调用不同的方法(实例)
- Swift中动态调用实例方法介绍
- 通过反射动态调用类的静态方法和实例方法
- 反射机制进行动态调用的两种创建方法实例与hama中的反射机制
- Java动态调用类方法实例
- 利用反射来动态创建实例和调用方法
- 利用反射来动态创建实例和调用方法
- 【实例】动态调用方法,通过类名
- 利用反射来动态创建实例和调用方法
- asp.net动态加载程序集创建指定类的实例及调用指定方法
- 反射动态调用、实例化窗体的方法
- Yii2 自动加载,依赖注入,获取实例,动态调用方法
- 使用反射构造对象实例并动态调用方法
- 11.2 创建动态代理实例即调用其方法
- 利用反射来动态创建实例和调用方法
- 如何的获得动态类的实例对象、调用其方法及InvocationHandler的运行原理