ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Java从入门到放弃 之 类加载器】 [打印本页]

作者: 忿忿的泥巴坨    时间: 2024-12-4 10:20
标题: 【Java从入门到放弃 之 类加载器】
类加载器

类加载器负责将Java字节码文件(.class文件)动态加载到内存中,并将其转化为JVM可以实行的类对象。它是Java运行时系统的一部门,支持Java的动态特性,使得Java程序可以在运行时加载类和接口。
动态加载类的两种方式

  1. public class ClassLoaderTest {
  2.     static {
  3.         System.out.println("ClassLoaderTest");
  4.     }
  5. }
复制代码
  1. public class Test24 {
  2.     public static void main(String[] args) throws ClassNotFoundException {
  3.         loadClass1();
  4.     }
  5.     // 使用ClassLoader.loadClass
  6.     public static void loadClass1() throws ClassNotFoundException {
  7.         Class<?> testClass = Test24.class.getClassLoader()
  8.                 .loadClass("com.example.mydemo.test.ClassLoaderTest
  9. ");
  10.         System.out.println(testClass.getName());
  11.     }
  12.     // 使用Class.forName
  13.     public static void loadClass2() throws ClassNotFoundException {
  14.         Class<?> testClass = Class.forName(
  15.                 "com.example.mydemo.test.ClassLoaderTest
  16. ");
  17.         System.out.println(testClass.getName());
  18.     }
  19. }
复制代码
输出:
  1. com.example.mydemo.test.ClassLoaderTest
复制代码
  1. public class Test24 {    public static void main(String[] args) throws ClassNotFoundException {        loadClass2();    }    // 使用ClassLoader.loadClass    public static void loadClass1() throws ClassNotFoundException {        Class<?> testClass = Test24.class.getClassLoader()                .loadClass("com.example.mydemo.test.ClassLoaderTest
  2. ");        System.out.println(testClass.getName());    }    // 使用Class.forName    public static void loadClass2() throws ClassNotFoundException {        Class<?> testClass = Class.forName(                "com.example.mydemo.test.ClassLoaderTest
  3. ");        System.out.println(testClass.getName());    }}
复制代码
输出:
  1. ClassLoaderTest
  2. com.example.mydemo.test.ClassLoaderTest
复制代码
差别之处
很显着,class.forname方法除法了静态方法,而getClassLoader().loadclass方法未出发静态方法。
类加载过程

类加载过程可以分为以下几个步骤:
双亲委派模子

双亲委派模子(Parent Delegation Model):当一个类加载器试图加载某个类时,它会先将这个请求委托给父类加载器,而不是自己直接加载。只有当父类加载器无法找到该类时,才由当前类加载器实行加载。
特点


类加载器层次结构


假如你有英文底子的话,可以阅读一下官方对类加载器的文章
自界说类加载器

除了使用JVM提供的默认类加载器外,开发人员还可以根据需要自界说类加载器。自界说类加载器通常需要继续java.lang.ClassLoader类,并重写其中的findClass()方法或loadClass()方法。通过自界说类加载器,可以实现一些特殊的功能,如从网络加载类、从数据库加载类等。
** 为啥有系统类加载器还需要自界说类加载器呢**
我们通过创建自界说类加载器,可以实现Tomcat应用隔离 支持jsp OSGI实现动态模块化。这些听起来比较晕是吧。 Java同一个类被差别的类加载器加载会得到同一个类的差别Class对象。
  1. public class Test26 {
  2.     public static void main(String[] args) throws ClassNotFoundException {
  3.         MyClassLoader myClassLoader = new MyClassLoader();
  4.         Class<?> aClass = myClassLoader.loadClass("com.example.mydemo.test.Test1");
  5.         MyClassLoader myClassLoader1 = new MyClassLoader();
  6.         Class<?> bClass = myClassLoader1.loadClass("com.example.mydemo.test.Test1");
  7.         if (aClass != bClass) {
  8.             System.out.println("aClass is different from bClass");
  9.         }
  10.     }
  11. }
复制代码
aClass 跟 bClass 是差别的对象。
** 这有啥用呢**
总结

我们主要先容了类加载机制与双亲委派模子,另外重点先容了自界说类加载器。盼望能给你带去帮助。也欢迎大家留言,评论,私信。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4