查看各类加载器的加载路径:
// 查看加载器位置
System.out.println(System.getProperty("sun.boot.class.path"));
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(System.getProperty("java.class.path"));
public class MyTest18_1 {
public static void main(String[] args) throws Exception{
MyTest16 loader1 = new MyTest16("loader1");
loader1.setPath("D:\\workspace\\");
Class<?> clazz = loader1.loadClass("com.yshuoo.jvm.classloader.MyTest1");
System.out.println("class: " + clazz.hashCode());
System.out.println("class loader:" + clazz.getClassLoader());
}
}
将MyTest1放入启动类加载器能加载的路径里,最后就会有启动类加载器加载MyTest1
扩展类加载器主要是加载一些加密解密的类
public class MyTest19 {
public static void main(String[] args) {
AESKeyGenerator aesKeyGenerator = new AESKeyGenerator();
System.out.println(aesKeyGenerator.getClass().getClassLoader());
System.out.println(MyTest19.class.getClassLoader());
}
}
修改扩展类加载器的加载路径为当前路径
java -Djava.ext.dirs=./ com.yshuoo.jvm.classloader.MyTest19
运行会发生异常,说明加载路径都是固定的
public class MyPerson {
private MyPerson myPerson;
public void setMyPerson(Object myPerson) {
this.myPerson = (MyPerson)myPerson;
}
}
MyTest16 loader1 = new MyTest16("loader1");
MyTest16 loader2 = new MyTest16("loader2");
Class<?> clazz1 = loader1.loadClass("com.yshuoo.jvm.classloader.MyPerson");
Class<?> clazz2 = loader2.loadClass("com.yshuoo.jvm.classloader.MyPerson");
System.out.println(clazz1 == clazz2);
输出为true,尽管loader1和loader2是不同的加载器实例,但是都会委托应用类加载器去加载MyPerson