/*
* 创建日期 2004-7-2
* 创建人 HongSoft
* 文件名 TestCompile.java
*/
package com.hongsoft.test;
import java.io.*;
//定制的类装入器
public class TestCompile extends ClassLoader
{
String _compiler;
String _classpath;
public static void main(String[] args)
{
new TestCompile();
}
public TestCompile()
{
super(ClassLoader.getSystemClassLoader());
//默认编译器
if (_compiler == null)
_compiler = "D:\\j2sdk1.4.2\\bin\\javac";
_classpath = ".";
String extraclasspath =
"c:\\Program Files\\Java\\j2re1.4.2\\lib\\rt.jar";
// = System.getProperty("calc.classpath");
if (extraclasspath != null)
{
_classpath =
_classpath
+ System.getProperty("path.separator")
+ extraclasspath;
}
compile();
}
public void compile()
{
String filename = "";
String classname = "";
try
{
//创建临时文件
File javafile =
File.createTempFile("compiled_", ".java", new File("."));
filename = javafile.getName();
classname = filename.substring(0, filename.lastIndexOf("."));
generateJavaFile(javafile, classname);
//编译文件
invokeCompiler(javafile);
//创建java类
byte[] buf = readBytes(classname + ".class");
Class c = defineClass(buf, 0, buf.length);
try
{
c.newInstance();
}
catch (IllegalAccessException e)
{
throw new RuntimeException(e.getMessage());
}
catch (InstantiationException e)
{
throw new RuntimeException(e.getMessage());
}
}
catch (IOException e)
{
throw new RuntimeException(e.getMessage());
}
}
//生成java文件
void generateJavaFile(File javafile, String classname) throws IOException
{
FileOutputStream out = new FileOutputStream(javafile);
String text =
"public class "
+ classname
+ " {"
+ " public int getCreater() {return 1;}"
+ "}";
out.write(text.getBytes());
out.close();
}
//编译java文件
void invokeCompiler(File javafile) throws IOException
{
String[] cmd =
{ _compiler, "-classpath", _classpath, javafile.getName()};
//执行编译命令
//A1:
Process process = Runtime.getRuntime().exec(cmd);
try
{ //等待编译器结束
process.waitFor();
}
catch (InterruptedException e)
{
}
int val = process.exitValue();
if (val != 0)
{
throw new RuntimeException("编译错误:" + "错误代码" + val);
}
}
//以byte数组形式读入类文件
byte[] readBytes(String filename) throws IOException
{
File classfile = new File(filename);
byte[] buf = new byte[(int) classfile.length()];
FileInputStream in = new FileInputStream(classfile);
in.read(buf);
in.close();
return buf;
}
}