import java.io.*;
//自定义类加载编译器
public class Compilation extends ClassLoader{
//加载类的二进制代码
private byte[] loadClassData(String fileName)throws IOException{
//读取类文件
File file = new File(fileName);
if(!file.exists()){
return null;
}
FileInputStream input = new FileInputStream(file);
long length = file.length();
byte[] bt = new byte[(int)length];
int rl = input.read(bt);
if(rl != length){
throw new IOException("不能读取所有内容");
}
input.close();
return bt;
}
//编译原代码文件
private boolean compile( String javaFile ) throws IOException {
// 知会用户在编译的文件
System.out.println( "编译类 : "+javaFile );
// 启动java编译器
Process p = Runtime.getRuntime().exec( "javac "+javaFile );
// 等待编译完成
try {
p.waitFor();
} catch( InterruptedException e ) {
System.out.println("编译失败");
}
// 返回子进程的出口值,值 0 表示正常终止。
int ret = p.exitValue();
return ret==0;
}
public Class loadClass( String name, boolean resolve )
throws ClassNotFoundException {
System.out.println("加载类: "+ name);
//目标class对象
Class clas = null;
// 查看是否已经加载该类
clas = findLoadedClass( name );
//把类的包结构转化成系统文件目录
String fileStub = name.replace( '.', '/' );
String javaFilename = fileStub+".java";
String classFilename = fileStub+".class";
File javaFile = new File( javaFilename );
File classFile = new File( classFilename );
// 查看是否是最新编译的文件
if (javaFile.exists() &&
(!classFile.exists() ||
javaFile.lastModified() > classFile.lastModified())) {
try {
// 编译文件
if (!compile( javaFilename ) || !classFile.exists()) {
throw new ClassNotFoundException( "没找到类文件: "+javaFilename );
}
} catch( IOException ie ) {
throw new ClassNotFoundException( "找不到类 : " + name);
}
}
if(classFile.exists()){
//获取字节码
try {
byte raw[] = loadClassData(classFilename);
// 转化成class对象
clas = defineClass( name, raw, 0, raw.length );
} catch( IOException e){
System.out.println("转化成class对象失败:" + classFilename);
}
}
// 查找classpath中是否存在
if (clas == null) {
clas = findSystemClass(name);
}
// 是否需要分析字节码
if (resolve && clas != null)
resolveClass( clas );
// 找不到该类
if (clas == null)
throw new ClassNotFoundException( "类不存在" );
return clas;
}
}
|