日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jvm十三:类加载器命名空间

發(fā)布時(shí)間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm十三:类加载器命名空间 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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(); // 默認(rèn)系統(tǒng)類加載器是自定義類加載器的父加載器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文件拷貝到一個(gè)路徑A下,然后從類路徑下將類刪除, 這時(shí)候,兩個(gè)自定義類加載器同時(shí)加載路徑A下的類,同名的類就會加載兩次,因?yàn)閮蓚€(gè)類加載器就是兩個(gè)不同的命名空間。

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(); // 默認(rèn)系統(tǒng)類加載器是自定義類加載器的父加載器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"); // 設(shè)置 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());}}

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的jvm十三:类加载器命名空间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。