黑马程序员技术交流社区
标题:
关于类加载器
[打印本页]
作者:
唐长智
时间:
2013-3-3 21:38
标题:
关于类加载器
本帖最后由 唐长智 于 2013-3-3 21:41 编辑
在高新技术的第47集里有几个问题,请大家帮忙解决下。
主函数
Class clazz = new MyClassLoader("itcastlib").loadClass("cn.itcast.day2.ClassLoaderAttachment");
Date d1 = (Date)clazz.newInstance();
System.out.println(d1);
复制代码
自定义ClassLoader类
protected Class<?> findClass(String name) throws ClassNotFoundException {
//继承ClassLoader覆写了findClass()方法,但是这个方法是什么时候调用的呢?
String classFileName = classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class";
try {
FileInputStream fis = new FileInputStream(classFileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
cypher(fis,bos);
fis.close();
byte[] bytes = bos.toByteArray();
return defineClass(bytes, 0, bytes.length);
//这是一个已经过时的方法,新的方法的参数不一样,具体是这样的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);语句,老师自己的类加载器前面已经写好了找指定目录下的类
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, 下载次数: 20)
下载附件
2013-3-3 23:02 上传
作者:
BitmapFactory
时间:
2013-3-3 23:29
@Deprecated
protected final Class<?> defineClass(byte[] b, int off, int len)
throws ClassFormatError
{
return defineClass(null, b, off, len, null);
}
复制代码
这个是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