让 java 动态
【IT168技术文档】企图说明:
代码的可用性是没有的,但代码向我们打开了一个使java动态编译的一向大门
有想法的程序员们。我们在此得到了什么?
代码说明:
1.为了使用例子的方便 testJavac.java 是 Bean ( name , avg ) 也是 逻辑类 ( eval(string) )
2.运行请在 classpath 加入 java\lib\tools.jar jar 包 ( com.sun.tools.javac.Main )
3.还是方便运行本例对 自己在什么 path 并不在意 类中使用了 System.getProperty("user.dir")
D:\javac>javac -classpath D:\java\lib\tools.jar;. testJavac.java
D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getName
刘凯毅
//此时在当前目录下你可以看到 多了一个 Temp.java 和 Temp.class 文件
//再使用 CalssLoader.loadClass方法动态加载到运行环境中来
//创建 动态 加载 动态 (java 动起来了)
D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getAvg 24
原文地址
代码的可用性是没有的,但代码向我们打开了一个使java动态编译的一向大门
有想法的程序员们。我们在此得到了什么?
代码说明:
1.为了使用例子的方便 testJavac.java 是 Bean ( name , avg ) 也是 逻辑类 ( eval(string) )
2.运行请在 classpath 加入 java\lib\tools.jar jar 包 ( com.sun.tools.javac.Main )
3.还是方便运行本例对 自己在什么 path 并不在意 类中使用了 System.getProperty("user.dir")
运行结果import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.lang.reflect.Method; import com.sun.tools.javac.Main; public class testJavac{ public String getName(){ return "刘凯毅"; } public int getAvg(){ return 24; } public Object eval(String str)throws Exception{ //生成java文件 String s = "class Temp{"; s += "private testJavac tj = new testJavac();"; s += "public String rt(){"; s += " return \"\"+tj."+str+"();" ; s += "}"; s +="}"; File f = new File(System.getProperty("user.dir")+"\\Temp.java"); PrintWriter pw = new PrintWriter(new FileWriter(f)); pw.println(s); pw.close(); //动态编译 Main javac = new Main(); String[] cpargs = new String[] {"-d", System.getProperty("user.dir") ,"Temp.java"}; int status = javac.compile(cpargs); if(status!=0){ System.out.println("没有成功编译源文件!"); return null; } //调用Temp的rt方法返回结果: ClassLoader mc = this.getClass().getClassLoader(); Class clasz = mc.loadClass("Temp"); Method rt = clasz.getMethod("rt", new Class[]{}); return rt.invoke(clasz.newInstance(), new Object[] { }); //如果方法没有返回就直接调用 } public static void main(String[]args)throws Exception{ testJavac jj = new testJavac(); System.out.println( jj.eval(args[0]) ); } }
D:\javac>javac -classpath D:\java\lib\tools.jar;. testJavac.java
D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getName
刘凯毅
//此时在当前目录下你可以看到 多了一个 Temp.java 和 Temp.class 文件
//再使用 CalssLoader.loadClass方法动态加载到运行环境中来
//创建 动态 加载 动态 (java 动起来了)
D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getAvg 24
原文地址
0
相关文章