A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐长智 中级黑马   /  2013-3-3 21:38  /  1642 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐长智 于 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),在这个例子中第一个参数应该怎么传呢?
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

7 个回复

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是我自己写的,参数name就是用的findClass的name,类加载器的作用是把硬盘的.class文件加载到内存,内存中的这部分类的代码就类的字节码,这个name应该就是内存中字节码的名字,可以查api看下,我的一点理解

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

MyclassLoader.jpg

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
  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)则不会出错,而且和老师做的结果一样
回复 使用道具 举报
还是没大懂,等明天再结合全部代码看一遍
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马