ClassLoader类加载器的用法
2020-02-12 本文已影响0人
手打小黑板
package com.liming.classloader;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class FileSystemClassLoader extends ClassLoader{
private String rootDir;
public FileSystemClassLoader(String rootDir) {
this.rootDir = rootDir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> xlass = findLoadedClass(name);
if (xlass != null) {
return xlass;
}else{
try {
xlass = getParent().loadClass(name);
if (xlass != null) {
return xlass;
}else{
return null;//此处传出null对象,表明没有加载到类
}
} catch (ClassNotFoundException e) {
byte[] classData = loadClassData(name);
if (classData == null) {
throw new ClassNotFoundException();
}else {
xlass = defineClass(name, classData, 0, classData.length);
if (classData == null) {
throw new ClassNotFoundException();
} else {
return xlass;
}
// e.printStackTrace();
}
}
}
}
private byte[] loadClassData(String name){
//need rootDir name
ByteArrayOutputStream baos=null;
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream((rootDir+name.replaceAll("\\.","/")+".class")));
) {
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024*8];
int len;
while ((len = bis.read(buffer,0,buffer.length))!=-1){
baos.write(buffer,0,len);
}
baos.flush();
}catch(IOException e){
e.printStackTrace();
}
return baos.toByteArray();
}
public static void main1(String[] args) {
System.out.println("HelloWorld");
FileSystemClassLoader fscl = new FileSystemClassLoader("C:/");
//同一个类被不同的加载器加载,JVM会认为是不相同的类
System.out.println(fscl.getClass().getClassLoader());
try {
Class<?> xlass = fscl.findClass("com.liming.javassist.DT");
Class<?> xlass2 = fscl.findClass("java.lang.String");
System.out.println(xlass.getClassLoader());
System.out.println(xlass2.getClassLoader());
Object o = xlass.getConstructor(int.class,String.class).newInstance(888,"Fuck");
Method m = xlass.getMethod("test5");
System.out.println(m.invoke(o));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}