`
outlaw
  • 浏览: 29800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java ClassLoader深入研究(二)

阅读更多

五、关于两个ClassLoader载入同一个类

注意:由两个不同的ClassLoader载入的同一个类,其是不同类型的,因此如果进行赋值会报ClassCastException

示例:

 

  1. package Test;   
  2. import java.io.*;   
  3. import java.util.*;   
  4. public class TestClassLoader extends ClassLoader {   
  5.        
  6.     protected Map<String, Class> cache = new HashMap<String, Class>();   
  7.        
  8.     public TestClassLoader() {   
  9.         super();   
  10.     }   
  11.        
  12.     protected Class<?> findClass(String name) throws ClassNotFoundException {   
  13.         if (cache.get(name) != null) {   
  14.             return cache.get(name);   
  15.         }   
  16.         try {   
  17.             String tname = name.replace('.''/');   
  18.             File file = new File("c://" + tname + ".class");   
  19.             FileInputStream in = new FileInputStream(file);   
  20.             BufferedInputStream bufIn = new BufferedInputStream(in);   
  21.             ByteArrayOutputStream byteOut = new ByteArrayOutputStream();   
  22.             BufferedOutputStream bufOut = new BufferedOutputStream(byteOut);   
  23.             byte[] buffer = new byte[4096];   
  24.             int len = -1;   
  25.             while((len = bufIn.read(buffer)) != -1) {   
  26.                 bufOut.write(buffer, 0, len);   
  27.             }   
  28.             bufOut.flush();   
  29.             byteOut.flush();   
  30.             byte[] data = byteOut.toByteArray();   
  31.             Class cls = defineClass(name, data, 0, data.length);   
  32.             cache.put(name, cls);   
  33.             return cls;   
  34.         } catch (IOException e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.         return null;   
  38.     }   
  39. }   
  40. class TestLoaderA {   
  41.     public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {   
  42.         TestClassLoader loader = new TestClassLoader();   
  43.         System.out.println(TestAImp1.class.getClassLoader());   
  44.         System.out.println(loader.findClass("Test.TestAImp1").getClassLoader());   
  45.         TestAImp1 test = (TestAImp1)loader.findClass("Test.TestAImp1").newInstance();   
  46.         test.test();   
  47.            
  48.     }   
  49. }   
  50. public class TestAImp1 extends AbstractTestA {   
  51.     public void test() {   
  52.         System.out.println(Thread.currentThread().toString());   
  53.         System.out.println("Test");   
  54.     }   
  55. }  

 

 运行以上代码结果:

sun.misc.Launcher$AppClassLoader@197d257
Test.TestClassLoader@1b90b39
Exception in thread "main" java.lang.ClassCastException: Test.TestAImp1
 at Test.TestLoaderA.main(TestClassLoader.java:84)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics