黑马程序员技术交流社区

标题: 关于类加载器 [打印本页]

作者: 唐长智    时间: 2013-3-3 21:38
标题: 关于类加载器
本帖最后由 唐长智 于 2013-3-3 21:41 编辑

在高新技术的第47集里有几个问题,请大家帮忙解决下。
主函数
  1. Class clazz = new MyClassLoader("itcastlib").loadClass("cn.itcast.day2.ClassLoaderAttachment");
  2.                 Date d1 =  (Date)clazz.newInstance();
  3.                 System.out.println(d1);
复制代码
自定义ClassLoader类
  1. protected Class<?> findClass(String name) throws ClassNotFoundException {
  2.                 //继承ClassLoader覆写了findClass()方法,但是这个方法是什么时候调用的呢?
  3.                 String classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";
  4.                 try {
  5.                         FileInputStream fis = new FileInputStream(classFileName);
  6.                         ByteArrayOutputStream  bos = new ByteArrayOutputStream();
  7.                         cypher(fis,bos);
  8.                         fis.close();
  9.                         byte[] bytes = bos.toByteArray();
  10.                         return defineClass(bytes, 0, bytes.length);
  11. //这是一个已经过时的方法,新的方法的参数不一样,具体是这样的definClass(String name,byte[] bytes,int off, int len),在这个例子中第一个参数应该怎么传呢?
复制代码

作者: 唐长智    时间: 2013-3-3 22:19
还是不大懂,委托机制我懂,我不懂的是这两个方法在这个例子中的具体应用...
作者: 唐长智    时间: 2013-3-3 22:20
还是不大懂,委托机制我懂,我不懂的是这两个方法的具体应用...
作者: BitmapFactory    时间: 2013-3-3 22:53
类加载器加载类使用的是委托机制,比如孙子加载一个类,他先不加载,而是交给父亲去做,父亲也不加载,交给爷爷去加载,爷爷没办法,上面没人了,就只能自己去到自己的目录里去找这个类,如果没找到,再还给父亲,父亲再去到自己的目录去找这个类,如果没找到再还给孙子,这时孙子就得自己去找了,而能这样做是因为有return super.findClass(name);语句,老师自己的类加载器前面已经写好了找指定目录下的类
  1.         Class clazz = new MyClassLoader("itcastlib").loadClass("ClassLoaderAttachment");
复制代码
这句话就是在做:创建一个自己的类加载器类在itcastlib目录下,通过loadClass方法传递要调用的类ClassLoaderAttachment.class
在运行的时候在执行到findClass的时候会先按自己写的代码做,而不是去执行return super.findClass(name),当找到的时候就返回了,如果没找到,再丢给父亲,就是委托机制了
后面的那个问题就不知道怎么用了

作者: 孙晋学    时间: 2013-3-3 23:05
这是我自己写的,参数name就是用的findClass的name,类加载器的作用是把硬盘的.class文件加载到内存,内存中的这部分类的代码就类的字节码,这个name应该就是内存中字节码的名字,可以查api看下,我的一点理解

MyclassLoader.jpg (52.93 KB, 下载次数: 23)

MyclassLoader.jpg

作者: BitmapFactory    时间: 2013-3-3 23:29
  1.     @Deprecated
  2.     protected final Class<?> defineClass(byte[] b, int off, int len)
  3.         throws ClassFormatError
  4.     {
  5.         return defineClass(null, b, off, len, null);
  6.     }
复制代码
这个是ClassLoader原文件里对过时defineClass的定义,
我把那个name加上的时候编译不通过defineClass(name ,bytes, 0, bytes.length)
而改为defineClass(null ,bytes, 0, bytes.length)则不会出错,而且和老师做的结果一样
作者: 唐长智    时间: 2013-3-4 00:07
还是没大懂,等明天再结合全部代码看一遍




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