【jvm】用户自定义类加载器

一、说明
  • 1.java日常应用开发中,类的加载几乎是引导类加载器、系统类加载器和扩展类加载器3种类加载器相互配合执行的
  • 2.必要时,用户是可以自定义类加载器,来定制类的加载方式
二、优点
  • 1.隔离加载类
  • 2.修改类加载方式
  • 3.扩展加载源
  • 4.防止源码泄露
三、实现步骤
  • 1.开发人员通过继承抽象类 java.lang.ClassLoader类的方式,实现自己的类加载器
  • 2.在jdk1.2之前,在自定义类加载器时,总会继承ClassLoader类并重写loadClass()方法,从而实现自定义的类加载类
  • 3.在jdk1.2之后,不建议用户去覆盖loadClass方法,建议把自定义的类加载逻辑写在findClass()方法中
  • 4.在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLClassLoader类,可以避免自己去编写findClass方法及其获取字节码流的方式,使自定义类加载器编写更加简洁
四、ClassLoader
  • 1.是一个抽象类,后面所有的类加载器都继承自ClassLoader(不包括启动类加载器)
  • 2.启动类加载器是c++语言编写的,无法继承
  • 3.getParent():返回该类加载器的超类加载器
  • 4.loadClass(String name):加载名称为name的类,返回结果为java.lang.Class类的实例
  • 5.findClass(String name):查找名称为name的类,返回结果为java.lang.Class类的实例
  • 6.findLoadedClass(String name):查找名称为name的已经被加载过的类,返回结果为java.lang.Class类的实例
  • 7.defineClass(String name, byte[] b, int off, int len):把字节数组b中的内容转换为一个java类,返回结果为java.lang.Class类的实例
  • 8.resolveClass(Class<?> c):连接指定的一个java类
五、获取ClassLoader的途径
  • 1.获取当前类的ClassLoader:clazz.getClassLoader()
  • 2.获取当前线程上下文的ClassLoader:Thread.currentThread().getContextClassLoader()
  • 3.获取系统的ClassLoader:ClassLoader.getSystemClassLoader()
  • 4.获取调用者的ClassLoader:DriverManager.getCallerClassLoader()

猜你喜欢

转载自blog.csdn.net/qq_32088869/article/details/132351443