通过tool.jar动态生成类并编译加载

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

jdk\lib目录下的tool.jar包含了一个完整的java编译器包,利用它可以实现类文件的运行时动态生成并且编译加载。下面是一个例子:

import java.io.*;

import java.util.*;

import java.lang.reflect.*;

public class MakeTodayClass {

Date today = new Date();

String todayMillis = Long.toString(today.getTime());

String todayClass = "z_" + todayMillis;

String todaySource = todayClass + ".java";

public static void main (String args[]){

MakeTodayClass mtc = new MakeTodayClass();

mtc.createIt();

if (mtc.compileIt()) {

System.out.println("Running " + mtc.todayClass + ":\n\n");

mtc.runIt();

}

else

System.out.println(mtc.todaySource + " is bad.");

}

public void createIt() {

try {

FileWriter aWriter = new FileWriter(todaySource, true);

aWriter.write("public class "+ todayClass + "{");

aWriter.write(" public void doit() {");

aWriter.write(" System.out.println(\""+todayMillis+"\");");

aWriter.write(" }}\n");

aWriter.flush();

aWriter.close();

}

catch(Exception e){

e.printStackTrace();

}

}

public boolean compileIt() {

String [] source = { new String(todaySource)};

ByteArrayOutputStream baos= new ByteArrayOutputStream();

new sun.tools.javac.Main(baos,source[0]).compile(source);

// if using JDK >= 1.3 then use

// public static int com.sun.tools.javac.Main.compile(source);

return (baos.toString().indexOf("error")==-1);

}

public void runIt() {

try {

Class params[] = {};

Object paramsObj[] = {};

Class thisClass = Class.forName(todayClass);

Object iClass = thisClass.newInstance();

Method thisMethod = thisClass.getDeclaredMethod("doit", params);

thisMethod.invoke(iClass, paramsObj);

}

catch (Exception e) {

e.printStackTrace();

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航