研究JAVA CLASS LOADING已经好多天了。今天刚刚把代码初步整理了下。等待导师的指点。
MyClassLoader.class文件。
自定义CLASSLOADER类的实现:
/** */
/**
* classloader single
* @author zhaojiucheng,liji
* @version 1.2
* 在1.1的基础上实现实现动态Reload
*/
package
zhao;

import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.net.URL;
import
java.net.URLClassLoader;
import
java.util.ArrayList;
import
java.util.Enumeration;
import
java.util.Hashtable;
import
java.util.List;
import
java.util.jar.JarEntry;
import
java.util.jar.JarFile;
import
java.util.jar.JarInputStream;


/** */
/**
* 自定义类加载器
*/

public
class
MyClassLoader
extends
ClassLoader
{

private static String MyClasspath = new String("");

private static ArrayList loadClassList = new ArrayList();

private static Hashtable loadClassHashTable = new Hashtable();

private static Hashtable loadClassTime = new Hashtable();


public MyClassLoader()
{

}


/** *//**
* 构造自定义的加载器 参数1:路径名
*/

public MyClassLoader(String MyClasspath)
{

if (!MyClasspath.endsWith("\\"))
{
MyClasspath = MyClasspath + "\\";
}
this.MyClasspath = MyClasspath;
}


/** *//**
* 设置加载路径 参数1:路径名
*/

public void SetMyClasspath(String MyClasspath)
{

if (!MyClasspath.endsWith("\\"))
{
MyClasspath = MyClasspath + "\\";
}
this.MyClasspath = MyClasspath;
}


/** *//**
* 查找类并加载 参数1:文件名 被 loadClass() 调用
*/

public Class findClass(String name)
{
byte[] classData = null;

try
{
classData = loadClassData(name);

} catch (IOException e)
{
e.printStackTrace();
}
System.out.println("自定义加载器正在加载: " + name + "
");
Class c = defineClass(name, classData, 0, classData.length);
loadClassHashTable.put(name, c);
System.out.println("加载" + name + "类成功。");
return c;
}


/** *//**
* 读取文件字节码 参数1:文件名 被 findClass() 调用
*/

private byte[] loadClassData(String name) throws IOException
{
String filePath = searchFile(MyClasspath, name + ".class");

if (!(filePath == null || filePath == ""))
{
System.out.println("已经找到" + filePath + ",开始读取字节码并加载。");
FileInputStream inFile = new FileInputStream(filePath);
byte[] classData = new byte[inFile.available()];
inFile.read(classData);
inFile.close();
loadClassTime.put(name, new File(filePath).lastModified());
return classData;

} else
{
filePath = searchFile(MyClasspath, name + ".java");

if (!(filePath == null || filePath == ""))
{
System.out.println("已经找到" + filePath + "并开始编译");
Runtime.getRuntime().exec("javac " + filePath);

try
{
Thread.sleep(1000);

} catch (InterruptedException e)
{
e.printStackTrace();
}
return loadClassData(name);

} else
{
System.out.println("未找到类文件,读取字节码失败!");
return null;
}
}
}


/** *//**
* 加载类 参数1:字节码数组 参数2:类名
*/
public Class loadClass(byte[] classData, String className)

throws ClassNotFoundException
{
System.out.println("自定义加载器正在加载: " + className + "
");
Class c = defineClass(className, classData, 0, classData.length);
loadClassHashTable.put(className, c);
System.out.println("加载" + className + "类成功。");
return c;
}


/** *//**
* 加载类 参数1:类名 类名从当前文件系统中查找指定的Class文件
*/

public Class loadClass(String name) throws ClassNotFoundException
{
return loadClass(name, false);
}


/** *//**
* 加载类 参数1:类名 参数2:是否分析这个类
*/
protected Class loadClass(String name, boolean resolve)

throws ClassNotFoundException
{
byte[] classData = null;
Class temp = null;

try
{
temp =
MyClassLoader.class文件。
自定义CLASSLOADER类的实现:


























































































































































































