一:继承ClassLoader
package com.lean.classload;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 自定义路径类加载器
* 继承ClassLoader
*
*/
public class PathClassLoader extends ClassLoader{
private String classPath; //类的路径
private final String packageName = "net.";//包名
/* 重写加载类的方法
* (non-Javadoc)
* @see java.lang.ClassLoader#findClass(java.lang.String)
*/
@Override
protected java.lang.Class<?> findClass(String name) throws ClassNotFoundException {
if(packageName.startsWith(name)){
byte [] classData = this.getData(name);
if(null == classData){
throw new ClassNotFoundException(name);
}else{
//Converts an array of bytes into an instance of
//class Class. Before the Class can be used it must
//be resolved. This method assigns
return super.defineClass(name,classData,0,classData.length);
}
}else{
return super.loadClass(name);
}
}
/**
* 从文件中获取字节流
* @param className
* @return
*/
private byte[] getData(String className){
//File.separator 解决系统分隔符问题
String path= classPath + File.separator +className.replace(".", File.separator) +".class";
try {
InputStream is = new FileInputStream(path);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
byte [] buffer = new byte[1048];
int num = 0;
while((num = is.read(buffer)) != -1){
stream.write(buffer, 0, num);
}
return stream.toByteArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String getClassPath() {
return classPath;
}
public void setClassPath(String classPath) {
this.classPath = classPath;
}
}
二:继承URLClassLoader
package com.lean.classload;
import java.net.URL;
import java.net.URLClassLoader;
/**
* * 继承URLClassLoader
*
*/
public class URLPathClassLoader extends URLClassLoader {
private final String packageName = "net.";// 包名
public URLPathClassLoader(URL[] urls, ClassLoader classLoader) {
super(urls, classLoader);
// TODO Auto-generated constructor stub
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> clazz = findLoadedClass(name);
if (null != clazz) {
return clazz;
}
if (packageName.startsWith(name)) {
return super.findClass(name);
} else {
return super.loadClass(name);
}
}
}