av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

java - 匿名內(nèi)部類和繼承類,在實現(xiàn)ClassLoader時為什么會有區(qū)別

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

問題描述

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

/***類加載器與instanceof關(guān)鍵字演示**@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 }}

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

問題解答

回答1:

第二個代碼走到

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

加載class文件用getClass().getResourceAsStream

標(biāo)簽: java
主站蜘蛛池模板: 91久久| 久久久精品日本 | 日日操日日干 | 欧美三级视频在线观看 | 国产亚洲欧美日韩精品一区二区三区 | www.4567| 欧美日韩淫片 | 日韩欧美专区 | 久久一区二区av | 亚洲人成在线播放 | 国产精品美女一区二区三区 | 日韩精品一区二区三区在线播放 | 成人免费在线播放 | 欧美a在线看| 欧美精品一区二区三区在线 | 日韩精品一区二区三区高清免费 | 色视频www在线播放国产人成 | 中文字幕91| 日韩在线观看中文字幕 | 免费视频一区二区三区在线观看 | 日韩国产在线 | 国产xxx在线观看 | 久草久| 亚洲精品中文字幕在线观看 | 午夜ww | 日韩午夜精品 | 日韩一区二区精品 | 99色在线| 久热电影 | 国产精品久久久久aaaa九色 | 婷婷开心激情综合五月天 | 黄色片网站国产 | 久久精品小视频 | av黄色免费在线观看 | 国产专区视频 | 成年人黄色一级毛片 | 婷婷国产一区二区三区 | 深夜福利影院 | 成人在线视频一区 | 欧美一级片在线观看 | 国产成人精品一区二三区在线观看 |