黑马程序员技术交流社区

标题: 自定义ClassLoder [打印本页]

作者: zl78365336    时间: 2013-12-9 10:31
标题: 自定义ClassLoder
本帖最后由 zl78365336 于 2013-12-9 14:35 编辑

自定义类加载器,其中ClassLoder是抽象类,可以重写findClass方法,其它方法抽象方法为什么不用重写?



  1. class NetworkClassLoader extends ClassLoader {        
  2.         String host;         
  3.         int port;         
  4.         public Class findClass(String name) {            
  5.                 byte[] b = loadClassData(name);            
  6.                         return defineClass(name, b, 0, b.length);        
  7.         }        
  8.     private byte[] loadClassData(String name) {           
  9.                 // load the class data from the connection            
  10.                 . . .         
  11.         }   
  12. }


复制代码


作者: 红茶2331    时间: 2013-12-9 10:55
  1. class NetworkClassLoader extends ClassLoader {        
  2.         String host;         
  3.         int port;         
  4.         public Class findClass(String name) {            
  5.                 byte[] b = loadClassData(name);            
  6.                         return defineClass(name, b, 0, b.length);        
  7.         }        
  8.     private byte[] loadClassData(String name) {           
  9.                 // load the class data from the connection            
  10.                 . . .         
  11.         }   
  12. }
复制代码


我来给你代码整理一下,看起来太费劲了

貌似需要什么方法就复写什么方法,要是其他的都复写,估计你也写不过来吧
作者: kongling    时间: 2013-12-9 11:08
本帖最后由 kongling 于 2013-12-9 11:41 编辑

自己开发的类加载器只需要覆写 findClass(String name)方法即可。java.lang.ClassLoader类的方法 loadClass()会首先调用 findLoadedClass()方法来检查该类是否已经被加载过;如果没有加载过的话,会调用父类加载器的 loadClass()方法来尝试加载该类;如果父类加载器无法加载该类的话,就调用 findClass()方法来查找该类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass()方法,而是覆写 findClass()方法。
通常在 findClass()方法查找类的字节代码文件(.class 文件),然后读取该文件内容,自己处理之后(解密之类),最后通过 defineClass()方法来把这些字节代码转换成 java.lang.Class类的实例。
作者: zl78365336    时间: 2013-12-9 11:20
kongling 发表于 2013-12-9 11:08
自己开发的类加载器只需要覆写 findClass(String name)方法即可。java.lang.ClassLoader类的方法 loadClass ...

总结,关键字就是继承ClassLoader,覆写 findClass(),处理的数据,最后要返回defineClass( )方法,ClassLoader类的其它方法就不用考虑了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2