package com.lss;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
/**
* 自定义类加载
* @author SHOU SHEN LUAN
*
*/
public class MyClassLoader extends ClassLoader {
public static String CLASS_PATH = "D:\\";
public String name;
public MyClassLoader(String name) {
this.name = name;
}
public MyClassLoader(ClassLoader classLoader, String name) {
super(classLoader);
this.name = name;
}
@Override
public Class<?> findClass(String name) {
System.out.println("findClass:" + name);
byte[] data = loadClassData(name);
return this.defineClass(name, data, 0, data.length);
}
/**
* 加载Class文件
* @param name
* @return
*/
public byte[] loadClassData(String name) {
try {
name = name.replace(".", "//");
FileInputStream is = new FileInputStream(new File(CLASS_PATH + name
+ ".class"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while ((b = is.read()) != -1) {
baos.write(b);
}
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 需要注意的是 如果当前项目指定目录中包含该Class文件的话,ClassLoader在调用findLoaderdClass时则可以加载或从类加载缓存中获取到该类对象,者不会调用findClass
* @param args
*/
public static void main(String[] args) {
MyClassLoader classLoader = new MyClassLoader("myClassLoader");
try {
Class<?> clazz = classLoader.loadClass("com.lss.json.Pojo");
Object object = clazz.newInstance();
System.out.println(object.toString());
/*自定义ClassLoader类*/
System.out.println(object.getClass().getClassLoader());
//AppClassLoader JVM用此ClassLoader来加载启动参数中指定的ClassPath中Jar包及目录
System.out.println(object.getClass().getClassLoader().getParent());
//ExtClassLoader JVM 用此ClassLoader 来加载扩展功能的一些Jar包,例如SunJDK 中目录下有dns工具Jar包等,
System.out.println(object.getClass().getClassLoader().getParent().getParent());
//sun.misc.Launcher$ExtClassLoader的父类是{Bootstrap ClassLoader}使用C++实现,在代码中无法拿到该对象
//Sun JDK 启动时会初始化此ClassLoader,并由ClassLoader 完成 $JAVA_HOME中jre/lib/rt.jar里面所有Class文件的加载,Jar中包含了Javs规范定义的所有的接口实现
System.out.println(object.getClass().getClassLoader().getParent().getParent().getParent());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
自定义类加载
最新推荐文章于 2024-05-22 18:18:00 发布