亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

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

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

瀏覽:127日期: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
主站蜘蛛池模板: 久久黄色一级视频 | 国产日韩精品在线 | 欧美日韩无 | 亚洲国产精品热久久2022 | 亚洲午夜在线观看 | 亚洲图片视频在线观看 | 国产成人精品三级在线 | 欧美精品一区二区在线观看播放 | 狠狠色狠狠色综合 | 一个色综合久久 | 美女黄色在线看 | 99久久国内精品成人免费 | 美女做爰视频在线观看免费 | 亚洲超大尺度激情啪啪人体 | 美国毛片视频 | 免费一级α片在线观看 | 久久国产精品免费观看 | 欧美日韩在线观看视频 | 网站午夜 | 高清一级片 | 色老头一区二区三区在线观看 | 特级a做爰全过程片 | 57pao强力打造手机版 | 97免费视频免费视频 | 狠狠色噜噜狠狠狠米奇9999 | 国产亚洲精品国产一区 | 欧美成人私人视频88在线观看 | 三级毛片大全 | 日本三级香港三级乳网址 | 精品国产一区二区三区免费 | 国产成人a一在线观看 | 国产三级a三级三级三级 | 9999毛片免费看 | 欧美一级毛片免费高清的 | 成年人视频在线免费看 | 免费一级肉体全黄毛片 | 热热涩热热狠狠色香蕉综合 | 欧美色老头gay | 国产成人精品久久二区二区 | 99久久香蕉国产线看观香 | 91热视频在线观看 |