黑马程序员技术交流社区
标题:
关于类加载器的问题
[打印本页]
作者:
高丽华
时间:
2014-1-19 10:29
标题:
关于类加载器的问题
学完了类加载器,自己还是有不懂得地方,类加载器和自定的类加载有什么区别呀!
作者:
§傻、才乖
时间:
2014-1-19 12:28
在java中可以有多个类加载器,默认有三个主要的类加载器,
BootStrap , ExtClassLoader , AppClassLoader
java中所有的类都由类加载器加载进内存,
类加载器本身也是java类,而类加载器是由BootStrp来加载
BootStrp不是java类,它是嵌在java虚拟机中的
所有的类加载器都采用具有父子关系的树形结构进行组织
在实例化一个类加载器对象时,需要为其指定一个父级类加载器
不指定,默认是系统加载器指定为其父级类加载器
每个类加载器都管辖一个范围
BootStrap 只在 jre/lib/rt.jar中找需要加载的类
ExtClassLoader 只在 jre/lib/ext中找需要加载的类
BootStrap 只在 classpath指定的目录中找需要加载的类
当java虚拟机在加载一个类时,首先会用当前线程的类加载器去加载线程中的第一个类
当类A中引用了类B,java虚拟机会用加载类A的类加载器去加载类B,如果没有找到类B,就会抛出ClassNotFoundException
还可以手动指定类加载器去加载某个类,ClassLoader.loadClass();
每个类加载器加载类时,又先委托给其父级类加载器
如果有父级类加载器,找到了这个类,直接用父级类加载器去加载
如果所有的父级类加载器都没有找到这个类,则回到发起者类加载器,
如果没有找到就会抛出ClassNotFoundException,而不会去让子级类加载器去找这个类
而自定义类加载器可以指定目录加载类,也可以在用的过程中把路径传进来,在类加载器内部处理传进来 的字符串,获取类名
作者:
花生壳
时间:
2014-1-19 12:35
如视频上讲的,自定义类加载器可以实现加密解密的功能,而系统默认的类加载器是定义好的,当然也就不能实现机密自己的字节码了。
功能不止,加密解密,使用字节的类加载器更灵活,方便
作者:
高丽华
时间:
2014-1-19 13:02
§傻、才乖 发表于 2014-1-19 12:28
在java中可以有多个类加载器,默认有三个主要的类加载器,
BootStrap , ExtClassLoader , AppClassLoader
三个主要类加载器是干什么的?
作者:
§傻、才乖
时间:
2014-1-19 13:49
每个类加载器都管辖一个范围
BootStrap 只在 jre/lib/rt.jar中找需要加载的类
ExtClassLoader 只在 jre/lib/ext中找需要加载的类
BootStrap 只在 classpath指定的目录中找需要加载的类
上边有写的
作者:
宋星
时间:
2014-1-19 14:58
说通俗点,就是一般我们自己写的普通类,都是在 classpath指定的目录中(classpath即.class文件所放的目录或jar),是用APPClassLoader类加载器加载的;而像java自带的类一般是由BootStrap加载的,例:System类是由BootStrap类加载器加载的。
ExtClassLoader类加载器一般加载的是扩展类。
而我们自定义的类加载器是加载我们自己指定目录里的类文件,可以用于加密解密我们自己想加密的.class 文件。
其实一般我们自己写的类都是在 classpath指定的目录中,用APPClassLoader类加载器加载就可以了(都是自动加载的)。类加载器的作用,加载.class文件。.class文件只有被类加载器加载了才能被执行,编译和执行是两个过程。(如果我的回答对你有些帮助,请给我加一分,因为我现在急需技术分入学)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2