有哪些类加载器?解释什么是双亲委派模型,为什么使用双亲委派模型,如何自定义类加载器?什么时候应该自定义类加载器?
2017-09-27 17:55
751 查看
类加载器:启动类加载器(bootstrap classLoader),扩展类加载器(extension),应用类加载器(Application),自定义类加载器(user
ClassLoader);
双亲委派模型:如果一个类加载器收到了加载某个类的请求,则该类加载器并不会去加载该类,而是把这个请求委派给父类加载器,每一个层次的类加载器都是如此,因此所有的类加载请求最终都会传送到顶端的启动类加载器;只有当父类加载器在其搜索范围内无法找到所需的类,并将该结果反馈给子类加载器,子类加载器会尝试去自己加载.
使用双亲委派模型原因:java类随着其类加载器一起具备了一种带有优先级的层次关系.例如
java.lang.Object,无论哪一个类加载器要加载该类,最终都是委托给处于顶端的启动类加载器,因此object在程序的各种类加载器环境中都是同一个类.相反如果没有使用双亲委派模型,那么假如用户自定义了一个称为java.lang.Object的类,并放在classPath中,那么系统将会出现多个不同的Object类,则java类型体系中最基础的行为都无法保证.
为什么需要自定义类加载器:
1)加密:java代码可以轻易的被反编译,如果你需要对你的代码进行加密以防止反编译,可以先将编译后的代码用加密算法加密,类加密后就不能再使用java自带的类加载器了,这时候就需要自定义类加载器.
2)从非标准的来源加载代码:字节码是放在数据库,甚至是云端,就可以自定义类加载器,从指定来源加载类.
自定义类加载器的方法:
1、如果不想打破双亲委派模型,那么只需要重写findClass方法即可
2、如果想打破双亲委派模型,那么就重写整个loadClass方法
private File getClassFile(String name)
{
File file = new File("D:/Person.class");//此处要提前编译Person类,并把class文件放到d盘下.
return file;
}
ClassLoader);
双亲委派模型:如果一个类加载器收到了加载某个类的请求,则该类加载器并不会去加载该类,而是把这个请求委派给父类加载器,每一个层次的类加载器都是如此,因此所有的类加载请求最终都会传送到顶端的启动类加载器;只有当父类加载器在其搜索范围内无法找到所需的类,并将该结果反馈给子类加载器,子类加载器会尝试去自己加载.
使用双亲委派模型原因:java类随着其类加载器一起具备了一种带有优先级的层次关系.例如
java.lang.Object,无论哪一个类加载器要加载该类,最终都是委托给处于顶端的启动类加载器,因此object在程序的各种类加载器环境中都是同一个类.相反如果没有使用双亲委派模型,那么假如用户自定义了一个称为java.lang.Object的类,并放在classPath中,那么系统将会出现多个不同的Object类,则java类型体系中最基础的行为都无法保证.
为什么需要自定义类加载器:
1)加密:java代码可以轻易的被反编译,如果你需要对你的代码进行加密以防止反编译,可以先将编译后的代码用加密算法加密,类加密后就不能再使用java自带的类加载器了,这时候就需要自定义类加载器.
2)从非标准的来源加载代码:字节码是放在数据库,甚至是云端,就可以自定义类加载器,从指定来源加载类.
自定义类加载器的方法:
1、如果不想打破双亲委派模型,那么只需要重写findClass方法即可
2、如果想打破双亲委派模型,那么就重写整个loadClass方法
private File getClassFile(String name)
{
File file = new File("D:/Person.class");//此处要提前编译Person类,并把class文件放到d盘下.
return file;
}
相关文章推荐
- JVM如何加载一个类的过程,双亲委派模型中有哪些方法?
- Python 集合是什么,为什么应该使用以及如何使用?
- (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
- Python 集合是什么,为什么应该使用以及如何使用?
- 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
- 什么时候应该使用==?什么时候应该使用Equals?(如何判断值相等还是引用相等。)
- [转载] 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用Web Service
- 什么时候应该使用OLE-DB,ADO 或ODBC
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service -
- 什么时候应该使用Web Service
- 什么时候应该使用 工厂模式
- 什么是外键?为什么要使用外键?如何来用?不用会怎样?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用OLE-DB,ADO或ODBC