Java語言中的自定義類加載器實例解析
本文研究的主要是Java語言中的自定義類加載器實例解析的相關(guān)內(nèi)容,具體如下。
自己寫的類加載器
需要注意的是:如果想要對這個實例進行測試的話,首先需要在c盤建立一個c://myjava的目錄。然后將相應(yīng)的java文件放在這個目錄中。并將產(chǎn)生的.clas文件放在c://myjava/com/lg.test目錄下,否則是找不到的。這是要注意的。。
class FileClassLoader :
package com.lg.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * Created by 鏉庢灉 on 2016/8/6. */ public class FileClassLoader extends ClassLoader { String rootDir=null; public FileClassLoader(String rootDir) { this.rootDir = rootDir; } @Override protected Class<?> findClass(String className) throws ClassNotFoundException { //首先檢查是否已經(jīng)被加載了。 Class<?> c = findLoadedClass(className); String path = rootDir + "/" + className.replace('.', '/') + ".class"; if (c != null) { return c; } else { /*雙親委托模式*/ ClassLoader loaderParent = this.getParent(); c = loaderParent.loadClass(className); if (c != null) { return c; } else { /*如果再不行的話,就再進行加載。因為字節(jié)碼的本質(zhì)就是一個字節(jié)數(shù)組*/ InputStream is = null; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { is = new FileInputStream(path); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } c = defineClass(className, buffer, 0, buffer.length); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } return c; } } }
class Demo :
package com.lg.test; /** * Created by 鏉庢灉 on 2016/8/6. */ /*相同的類加載器對同一個類進行加載,得到的hascode是相同的 * 不同的類加載器對同一類進行加載,得到的hascode是不一樣的*/ public class Demo { public static void main(String[] args) { FileClassLoader loader = new FileClassLoader("c://myjava"); FileClassLoader loader2=new FileClassLoader("c://myjava"); try { Class<?> c = loader.findClass("com.lg.test.HelloWorld"); Class<?> c0=loader.findClass("com.lg.test.HelloWorld"); Class<?> c1=loader2.findClass("com.lg.test.HelloWorld"); Class<?> c2=loader.findClass("com.lg.test.Demo01"); Class<?> c3=loader.findClass("java.lang.String"); System.out.println(c.hashCode()); System.out.println(c.getClassLoader()); System.out.println(c0.hashCode()); System.out.println(c0.getClassLoader()); System.out.println(c1.hashCode()); System.out.println(c1.getClassLoader()); System.out.println(c2.hashCode()); System.out.println(c2.getClassLoader()); System.out.println(c3.hashCode()); System.out.println(c3.getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
最后運行的結(jié)果為:
366712642
sun.misc.Launcher$AppClassLoader@4e0e2f2a
366712642
sun.misc.Launcher$AppClassLoader@4e0e2f2a
366712642
sun.misc.Launcher$AppClassLoader@4e0e2f2a
1829164700
sun.misc.Launcher$AppClassLoader@4e0e2f2a
2018699554
null
如果是定義網(wǎng)絡(luò)類加載器的話,那么就需要使用URL來進行了。這是要注意的。
可以將rootDie的值變?yōu)閏om.bjsxt.cn. 然后利用Url.openStream()就可以了。
總結(jié)
以上就是本文關(guān)于Java語言中的自定義類加載器實例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
設(shè)計模式之模版方法模式_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了設(shè)計模式之模版方法模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08springboot的http.server.requests服務(wù)請求流程源碼
這篇文章主要為大家介紹了springboot的http.server.requests服務(wù)請求流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12SpringBoot繼承LogStash實現(xiàn)日志收集的方法示例
這篇文章主要介紹了SpringBoot繼承LogStash實現(xiàn)日志收集的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05Eclipse中導(dǎo)入Maven Web項目并配置其在Tomcat中運行圖文詳解
這篇文章主要介紹了Eclipse中導(dǎo)入Maven Web項目并配置其在Tomcat中運行圖文詳解,需要的朋友可以參考下2017-12-12SVN報錯:Error Updating changes:svn:E155037的解決方案
今天小編就為大家分享一篇關(guān)于SVN報錯:Error Updating changes:svn:E155037的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫的認證(springsecurity整合mybatis)
這篇文章主要介紹了一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫的認證(springsecurity整合mybatis),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10