package com.loadClasses;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
public class ClassLoaderOne extends ClassLoader{
public static void main(String[] args) {
try {
ClassLoaderOne loader =
new ClassLoaderOne(
"D:\\WorkspacesShangHai\\myJava\\src\\lib\\Tool.class"
);
Class<?> clazz = null;
try {
clazz = loader.loadClass("com.loadClasses.Tool");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Object o = null;
try {
o = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(o.getClass().getClassLoader());
//sun.misc.Launcher$AppClassLoader@6b97fd
//======================2
Method[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++) {
String name = methods[i].getName();
System.out.println(name);
Class<?>[] params = methods[i].getParameterTypes();
for (int j = 0; j < params.length; j++) {
System.out.println(params[j].toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private byte[] data;
public ClassLoaderOne(String clazzPath) throws IOException {
data = loadClassFile(clazzPath);
}
/**
* 加载class文件
*
* @param clazzPath
* class绝对文件路径
* @return 字节数组
* @throws IOException
*/
private byte[] loadClassFile(String clazzPath) throws IOException {
FileInputStream fis = new FileInputStream(clazzPath);
BufferedInputStream bis = new BufferedInputStream(fis);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 256];
int ch = 0;
while ((ch = bis.read(buffer, 0, buffer.length)) != -1) {
baos.write(buffer, 0, ch);
}
return baos.toByteArray();
}
@Override
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
Class<?> c = findLoadedClass(name);
if (c == null) {
// 如果父加载器不为null,使用父类加载器加载(比如Object,HashMap等核心类)
if (getParent() != null) {
try {
c = getParent().loadClass(name);
} catch (Exception e) {
// 父类可能没加载,则抛异常
}
}
// 如果父类加载器没有加载,再使用自定义加载器加载
if (c == null) {
c = defineClass(name, data, 0, data.length);
}
}
return c;
}
}
原文参考:http://wlh0706-163-com.iteye.com/blog/2098619