?????????jdk1.2???????????????????????????ζ????? ClassLoader ??????????????????? ClassLoader ????д??????????? ClassLoaders ??????? ClassLoader?????????????????? -- ??????????????????????????????jvm????Щ?????????????е????????????????class??????????????Hello.class??????????????ó????У???????α?????????????γ???????????????????????μ???????????????????
??????java.lang?????и?ClassLoader??ClassLoader ?????????????????????????? JVM ??????????????????????? ClassLoader ???????????? ClassLoader ??????????????????? Class ??????????????????????????ε?????????????????? ClassLoader???????и?loadClass(String name?? boolean resolve)???????÷????ClassLoader????????jdk1.2???loadClass????????????findClass????????????????ο?API??????????д??ClassLoader????????????????????????????????????????????????????????????????????????????????ClassLoader???и???????Class defineClass(String name?? byte[] b?? int off?? int len)?????????????????????class????????????Hello.class)????????????????byte[] b????????????Class????????Щ????????????????????????????:)
????defineClass???? JVM ?????????????????????????? -- ??????????????????????????У????Ч????????????????????????д???????????????????????????????????????????????????
?????????Щ??????
????findSystemClass??????????????????????????????????????????????????????????? defineClass ???????????? Class ???????????????????
????findClass??????jdk1.2???loadClass ??????????????·?????findClass ????????????? ClassLoader ???????????????????????????????????磬????????????????????? ClassLoader????
????getSystemClassLoader?? ??????? findClass ?? loadClass??getSystemClassLoader ?????????? ClassLoader ???????????? ClassLoader????????????? findSystemClass ??????????
????getParent??????????????и????? ClassLoader??????·??????? ClassLoader ?????????? ClassLoader???????????????????? ClassLoader ????????????????????????????
????resolveClass: ??????????????????????????????????????????????????????д????????? loadClass ?????????? resolveClass????????? loadClass ?? resolve ?????????
????findLoadedClass:????????棬?????? loadClass ??????????????÷??????? ClassLoader ?????????????????????????????????????????????鷳??????????÷?????
?????????????????
????1)???? findLoadedClass(String) ???????????????????????У????????????????????淽????????????
????2?????????ClassLoader????loadClass?????????????ClassLoader??null?????????????????????ClassLoader??
????3??????findClass(String)????????????
????4?????loadClass ?? resolve ????????true????????? resolveClass ???? Class ????.
????5???????????????? ClassNotFoundException??
????6????????????????ó???
????????????????ClassLoader???????
/**
*CompilingClassLoader.java
*Copyright 2005-2-12
*/
import java.io.*;
public class CompilingClassLoader extends ClassLoader{
//???????????????
private byte[] getBytes(String filename) throws IOException{
File file=new File(filename);
long len=file.length();
byte[] raw=new byte[(int)len];
FileInputStream fin=new FileInputStream(file);
int r=fin.read(raw);
if(r!=len) throw new IOException("Can't read all??"+r+"!="+len);
fin.close();
return raw;
}
private boolean compile(String javaFile) throws IOException{
System.out.println("CCL:Compiling "+javaFile+"...");
//????????javac????
Process p=Runtime.getRuntime().exec("javac "+javaFile);
try{
//????????????????????
p.waitFor();
}catch(InterruptedException ie){
System.out.println(ie);
}
int ret=p.exitValue();
return ret==0;
}
public Class loadClass(String name??boolean resovle) throws ClassNotFoundException{
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);
//???????class?????????
if(javaFile.exists()&&(!classFile.exists()||javaFile.lastModified()>classFile.lastModified())){
try{
if(!compile(javaFilename)||!classFile.exists()){
throw new ClassNotFoundException("ClassNotFoundExcetpion:"+javaFilename);
}
}catch(IOException ie){
throw new ClassNotFoundException(ie.toString());
}
}
try{
byte[] raw=getBytes(classFilename);
//????????????????????????????????
clas=defineClass(name??raw??0??raw.length);
}catch(IOException ie){
//
}
if(clas==null){
clas=findSystemClass(name);
}
System.out.println("findSystemClass:"+clas);
if(resovle && clas!=null){
resolveClass(clas);
}
if(clas==null){
throw new ClassNotFoundException(name);
}
return clas;
}
}