亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

java - 匿名內部類和繼承類,在實現ClassLoader時為什么會有區別

瀏覽:90日期:2023-11-29 09:52:36

問題描述

最近在看Java虛擬機,類加載器那節舉了這么一個例子:

/***類加載器與instanceof關鍵字演示**@author zzm*/public class ClassLoaderTest{ public static void main(String[]args) throws Exception{ClassLoader myLoader=new ClassLoader(){ @Override public Class<?>loadClass(String name)throws ClassNotFoundException{try{ String fileName=name.substring(name.lastIndexOf('.')+1)+'.class'; InputStream is=getClass().getResourceAsStream(fileName); if(is==null){return super.loadClass(name); } byte[]b=new byte[is.available()]; is.read(b); return defineClass(name,b,0,b.length);}catch(IOException e){ throw new ClassNotFoundException(name);} }};Object obj=myLoader.loadClass('org.fenixsoft.classloading.ClassLoaderTest').newInstance();System.out.println(obj.getClass());System.out.println(obj instanceof org.fenixsoft.classloading.ClassLoaderTest);//false }}

總而言之就是用自定義的類加載器去加載一個類,返回的類與jvm自帶的SystemClassLoader加載的類不同。

那么如果用一個繼承自ClasserLoader的類,按理說也是同樣的效果

package jvm;public class MyClassLoader extends ClassLoader{ @Override public Class<?> loadClass(String fullClassName) throws ClassNotFoundException{try { String fileName = fullClassName.substring(fullClassName.lastIndexOf('.')+1,fullClassName.length())+'.class'; InputStream is = getResourceAsStream(fileName); if(is==null){return super.loadClass(fullClassName); } byte[] bytes = new byte[is.available()]; is.read(bytes); return defineClass(fullClassName,bytes,0,bytes.length);}catch (Exception e){ throw new ClassNotFoundException();} } public static void main(String[] args) throws Exception{ClassLoader myClassLoader = new MyClassLoader();/**ClassLoader myClassLoader = new ClassLoader() { @Override public Class<?> loadClass(String fullClassName) throws ClassNotFoundException {try { String fileName = fullClassName.substring(fullClassName.lastIndexOf('.')+1,fullClassName.length())+'.class'; InputStream is = getClass().getResourceAsStream(fileName); if(is==null){return super.loadClass(fullClassName); } byte[] bytes = new byte[is.available()]; is.read(bytes); return defineClass(fullClassName,bytes,0,bytes.length);}catch (Exception e){ throw new ClassNotFoundException();} }};/**/ClassLoader systemClassLoader = java.lang.ClassLoader.getSystemClassLoader();Class myClass = myClassLoader.loadClass('jvm.MyClassLoader');Class systemClass = systemClassLoader.loadClass('jvm.MyClassLoader');Object myObj = myClass.newInstance();Object systemObj = systemClass.newInstance();System.out.println(myClass.equals(systemClass));//trueSystem.out.println(myObj.getClass().equals(systemObj.getClass()));//true }}

注釋里的代碼就是匿名內部類的繼承,注意到這里myClass和systemClass是完全相等的,但是myClass是使用繼承自ClassLoader的類MyClassLoader生成的,請問這是為什么呢。。。

問題解答

回答1:

第二個代碼走到

if(is==null){ return super.loadClass(fullClassName);}

加載class文件用getClass().getResourceAsStream

標簽: java
主站蜘蛛池模板: 日韩精品在线一区 | 亚洲主播 | 毛片在线看免费版 | 亚洲国产中文字幕 | 亚洲精品久久一区二区无卡 | 国产精品亚洲精品日韩动图 | 成人欧美一区二区三区视频xxx | 色综合小说久久综合图片 | 日本一级级特黄特色大片 | 久久成人性色生活片 | 精品国产香蕉在线播出 | 最新内地三级在线观看 | 久久免费精彩视频 | 国产亚洲精品美女2020久久 | 亚洲精品中文字幕无乱码 | 久久99精品久久久久久综合 | 亚洲国产成人精品青青草原100 | 国产在线五月综合婷婷 | 人妖三人交69欧美 | 欧美黑人与白人做爰 | 日韩一区二区不卡中文字幕 | 成年人的黄色 | 成年女人色费视频免费 | 草妞视频 | 搜索黄色录像 | 特黄特a级特别特级特毛片 特黄特色一级aa毛片免费观看 | 很污很污的网站 | 欧美呦女| 日本一区二区三区久久 | 国产亚洲亚洲精品777 | 六月丁香啪啪 | 一级黄色片免费观看 | 欧美一级aa天码毛片 | 日本理论在线观看被窝网 | 久久国产精品岛国搬运工 | 国产超薄肉色丝袜的免费网站 | 女人被免费看在线看 | 日本人爽p大片免费看 | 在线观看国产精美视频 | 超级碰碰碰在线观看 | a级免费观看 |