1. 前提
在写类加载器代码,首先要了解相关的知识点,起码要知道什么是类加载器,做什么用,如何使用等等相关理论知识,请参考深入浅出ClassLoader
2. 自定义类加载器,代码清单如下:
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
/**
* 犯的错误:
* 调用defineClass方法,name参数的值指定为类的文件名(Account.class),提示java.lang.NoClassDefFoundError: Account/class (wrong name: com/one/design/Account)
* @author Administrator
*
*/
public class TestClassLoader extends ClassLoader {
public Class findClass(String name) {
byte[] b = null;
try {
b = loadClassData(name);
} catch (IOException e) {
e.printStackTrace();
}
//define:vt. 定义;使明确;规定 [dɪ'faɪn]
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) throws IOException {
InputStream is = new FileInputStream("D:/work_dir2/Design/bin/com/one/design/Account.class");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int index;
while(( index = is.read()) != -1) {
baos.write(index);
}
return baos.toByteArray();
}
@Test
public void TestClassLoader() {
Class cl = findClass("com.one.design.Account");
System.out.println("Class Instance{}:"+cl);
System.out.println(cl.getClassLoader().getParent());
}
}
3. URLClassLoader类加载器测试,代码清单如下:
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import org.junit.Test;
/**
* 犯得错误:
* filePath的value值没有加上file:,导致提示java.net.MalformedURLException: unknown protocol: d
* @author Administrator
*
*/
public class TestURLClassLoader {
private String filePath = "file:D:/work_dir2/dubboconsumer/WebRoot/WEB-INF/lib";
/**
* 搜索地址文件目录的文件名称
* @return
*/
public String[] getFileNameList() {
File file = new File("D:/work_dir2/dubboconsumer/WebRoot/WEB-INF/lib");
return file.list();
}
@Test
public void getURLClassLoader() throws MalformedURLException {
String[] fileNameList = getFileNameList();
URL[] urls = new URL[fileNameList.length];
for(int i=0; i<fileNameList.length; i++) {
urls[i] = new URL(filePath+""+fileNameList[i]);
}
System.out.println(new URLClassLoader(urls));
System.out.println(TestURLClassLoader.class.getClassLoader().getParent());
}
}