jvm十三:类加载器命名空间
生活随笔
收集整理的這篇文章主要介紹了
jvm十三:类加载器命名空间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.atChina.jvm;import java.io.*;public class Test16 extends ClassLoader{private String classLoaderName;private String path;private String fileExtension = ".class";public Test16(String classLoaderName){super(); // 默認系統類加載器是自定義類加載器的父加載器this.classLoaderName = classLoaderName;}public Test16(ClassLoader parent, String classLoaderName){super(parent);// 為自定義類加載器定義父類加載器this.classLoaderName = classLoaderName;}// alt+insert 添加set,get方法快捷鍵public void setPath(String path) {this.path = path;}@Overrideprotected Class<?> findClass(String className){System.out.println("findClass.........");byte[] data = this.loadClassData(className);return this.defineClass(className, data, 0, data.length);}private byte[] loadClassData(String className){ByteArrayOutputStream baos = null;byte[] data = null;int ch ;FileInputStream fis = null;try {className = className.replace(".","\\");fis = new FileInputStream(new File(path + className+fileExtension));baos = new ByteArrayOutputStream();while(-1 != (ch = fis.read())){baos.write(ch);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();}finally{try {fis.close();baos.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("loadClassData.........."); // sout+tab鍵 可以快速生成 System.out.println()代碼return data;}public static void main(String[] args) throws Exception {Test16 t16 = new Test16("load1");//t16.setPath("F:\\myCode\\springBootCode\\IdeaProjects\\JvmTest\\out\\production\\JvmTest\\");t16.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz = t16.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object = clazz.newInstance();System.out.println(clazz.hashCode());System.out.println(object.getClass().getClassLoader());System.out.println("========================================");Test16 load2 = new Test16("load2");load2.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz2 = load2.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object2 = clazz2.newInstance();System.out.println(clazz2.hashCode());System.out.println(object2.getClass().getClassLoader());}}
?
? 將生成好的class文件拷貝到一個路徑A下,然后從類路徑下將類刪除, 這時候,兩個自定義類加載器同時加載路徑A下的類,同名的類就會加載兩次,因為兩個類加載器就是兩個不同的命名空間。
package com.atChina.jvm;import com.sun.org.apache.xpath.internal.SourceTree;import java.io.*;public class Test16 extends ClassLoader{private String classLoaderName;private String path;private String fileExtension = ".class";public Test16(String classLoaderName){super(); // 默認系統類加載器是自定義類加載器的父加載器this.classLoaderName = classLoaderName;}public Test16(ClassLoader parent, String classLoaderName){super(parent);// 為自定義類加載器定義父類加載器this.classLoaderName = classLoaderName;}// alt+insert 添加set,get方法快捷鍵public void setPath(String path) {this.path = path;}@Overrideprotected Class<?> findClass(String className){System.out.println("findClass.........");byte[] data = this.loadClassData(className);return this.defineClass(className, data, 0, data.length);}private byte[] loadClassData(String className){ByteArrayOutputStream baos = null;byte[] data = null;int ch ;FileInputStream fis = null;try {className = className.replace(".","\\");fis = new FileInputStream(new File(path + className+fileExtension));baos = new ByteArrayOutputStream();while(-1 != (ch = fis.read())){baos.write(ch);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();}finally{try {fis.close();baos.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("loadClassData.........."); // sout+tab鍵 可以快速生成 System.out.println()代碼return data;}public static void main(String[] args) throws Exception {Test16 load1 = new Test16("load1");//t16.setPath("F:\\myCode\\springBootCode\\IdeaProjects\\JvmTest\\out\\production\\JvmTest\\");load1.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz = load1.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object = clazz.newInstance();System.out.println(clazz.hashCode());System.out.println(object.getClass().getClassLoader());System.out.println(load1.getParent());System.out.println("========================================");Test16 load2 = new Test16(load1, "load2"); // 設置 load1為load2的父加載器load2.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz2 = load2.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object2 = clazz2.newInstance();System.out.println(clazz2.hashCode());System.out.println(object2.getClass().getClassLoader());System.out.println("========================================");Test16 load3 = new Test16("load3");load3.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz3 = load3.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object3 = clazz3.newInstance();System.out.println(clazz3.hashCode());System.out.println(object3.getClass().getClassLoader());System.out.println(load3.getParent());}}?
?
?
?
?
總結
以上是生活随笔為你收集整理的jvm十三:类加载器命名空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm十二:自定义类加载器
- 下一篇: jvm十四:类的卸载