自定义ClassLoader
生活随笔
收集整理的這篇文章主要介紹了
自定义ClassLoader
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
來源:http://a123159521.iteye.com/blog/1095264
以下是用法:?
NetworkClassLoader loader = new NetworkClassLoader();loader.setBaseUrl("file:///F:\\框架\\maven\\app\\jms\\src\\main\\webapp\\modules\\");loader.addURL("App/lib/test.jar");loader.addURL("App/lib/test1.jar");loader.addURL("App/template/view.vm");loader.addURL("App/config.xml");
這里初始化了此類加載器所使用的類資源,配置文件等。?
以下是如何加載類資源:?
Class clazz= loader.findClass("com.jvm.look.A");//加載類 以下是加載配置文件資源?
URL uuu = loader.findResource("App/config.xml"); 有一點需要注意的,這個類加載器還是雙親委托機制,比如有一個類"com.annotation.table.Test"在父類加載器中如果已經(jīng)加載過了,那么如果這個類在test.jar中存在,那么不會重新定義加載,而使用父類加載器加載的類,有人問了,那我如何覆蓋父類加載器中定義的類。?
可以進行如下操作:?
Class clazz2= loader.findClass("com.annotation.table.Test"); 重新加載類,類的加載序列我在上一篇已經(jīng)講過了,不熟悉的可以看以上文章.?
可能有人會問了,如果每一個類都這樣,那我不崩潰了,我需要把我加載的jar覆蓋父類加載器中定義的所有類.?
/*** 覆蓋父加載器中定義的類,使用當(dāng)前類加載器加載資源,那么所有的類都在此加載器中執(zhí)行.* 這樣,所有URL中的類都通過此類加載器加載,也就是說URL中的類的定義類加載器就是當(dāng)前類加載器.* 建議:盡量不要使用這種方式覆蓋父加載器定義的類.[按一種約定雙親委托機制加載]* (如果重載了,那么盡量使用此loader加載類,這樣所有邏輯都在此ClassLoader中運行,當(dāng)然還有SDK還是從雙親加載)* 可以在SDK中定義接口,在此JAR里面提供實現(xiàn).*/public void initAllJar(){URL[] urls = this.getURLs();for(URL urll:urls){String url = urll.getFile();//重新定義這個架包中的所有類.if(url.endsWith("jar")){File jarFile = getJarFile(url);JarFile jarFileTemp = null;try {jarFileTemp = new JarFile(jarFile);Enumeration<JarEntry> en = jarFileTemp.entries();while (en.hasMoreElements()) {JarEntry je = en.nextElement();String name = je.getName();if (name.endsWith(CLASS_FILE)) {String className = name.substring(0, name.length()- CLASS_FILE.length());findClass(pathToDot(className));}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/*** 轉(zhuǎn)jar包路徑和jar文件名為具體文件.** @param root* @param jar* @return*/private File getJarFile(String file) {if (file.startsWith(PREFIX_FILE))file = file.substring(PREFIX_FILE.length());int end = file.indexOf(JAR_URL_SEPERATOR);if (end != (-1))file = file.substring(0, end);return new File(file);}/*** 轉(zhuǎn)路徑為包名[/ ==> .]/[\\ ==> .]* @param s* @return*/private String pathToDot(String s) {return s.replace('/', '.').replace('\\', '.');}
其實JDK中已經(jīng)提供了好幾個ClassLoader,大家可以擴展,比如項目中有兩個架包版本,結(jié)構(gòu)全部都一樣,但是兩個架包都必須運行。這時自定義類加載器就有用了。
總結(jié)
以上是生活随笔為你收集整理的自定义ClassLoader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Encapsulate Collecti
- 下一篇: 句子录音打分代码参考