// 类加载器的核心代码 -加载类在需要的时候自动编译源文件。
public Class loadClass( String name, boolean resolve )
throws ClassNotFoundException {
//我们的目的是获得一个类对象。
Class clas = null;
// 首先,检查是否已经出理过这个类。
clas = findLoadedClass( name );
//System.out.println( "findLoadedClass: "+clas );
// 通过类名获得路径名 比如:java.lang.Object => java/lang/Object
String fileStub = name.replace( '.', '/' );
// 构建指向源文件和类文件的对象。
String javaFilename = fileStub+".java";
String classFilename = fileStub+".class";
File javaFile = new File( javaFilename );
File classFile = new File( classFilename );
//System.out.println( "j "+javaFile.lastModified()+" c "
//+classFile.lastModified() );
// 首先,判断是否需要编译。如果源文件存在而类文件不存在,或者都存在,但是源文件
// 较新,说明需要编译。
if (javaFile.exists() &&(!classFile.exists() ||
javaFile.lastModified() > classFile.lastModified())) {
try {
// 编译,如果编译失败,我们必须声明失败原因(仅仅使用陈旧的类是不够的)。
if (!compile( javaFilename ) || !classFile.exists()) {
throw new ClassNotFoundException( "Compile failed: "+javaFilename );
}
} catch( IOException ie ) {
// 可能编译时出现IO错误。
throw new ClassNotFoundException( ie.toString() );
}
}
// 确保已经正确编译或者不需要编译,我们开始加载原始字节。
try {
// 读取字节。
byte raw[] = getBytes( classFilename );
// 转化为类对象
clas = defineClass( name, raw, 0, raw.length );
} catch( IOException ie ) {
// 这里并不表示失败,可能我们处理的类在本地类库中,如java.lang.Object。
}
//System.out.println( "defineClass: "+clas );
//可能在类库中,以默认的方式加载。
if (clas==null) {
clas = findSystemClass( name );
}
//System.out.println( "findSystemClass: "+clas );
// 如果参数resolve为true,根据需要解释类。
if (resolve && clas != null)
resolveClass( clas );
// 如果还没有获得类,说明出错了。
if (clas == null)
throw new ClassNotFoundException( name );
// 否则,返回这个类对象。
return clas;
}
}
CCRun.java
一下是CCRun.java文件
import java.lang.reflect.*;
/*
CCLRun通过CompilingClassLoader加载类来运行程序。
*/
public class CCLRun
{
static public void main( String args[] ) throws Exception {
// 第一个参数指定用户要运行的主函数类。
String progClass = args[0];
// 接下来的参数是传给这个主函数类的参数。
String progArgs[] = new String[args.length-1];
System.arraycopy( args, 1, progArgs, 0, progArgs.length );