类的动态装载java

类的动态装载

  首先,我们要明白类加载的过程,再来区分静态加载和动态加载,类加载的过程,本质上就是将类文件,从硬盘读取到内存中的过程,而静态加载是在编译时加载,动态加载是在程序运行时,直到第一次使用时才加载。正是因为两种加载方式的加载的时间不同,导致他们的作用千差万别。

从内存的角度来看

  当我们运行一个游戏程序时, 刚一启动这个程序, 就把所有的关卡地图、怪物的数据一股脑加载到内存中,会怎样?
  不仅加载的时间长、而且内存中还会存放很多不常用的数据,占用宝贵的内存空间。 为了解决这个问题,我们就发明了动态加载的技术,在游戏启动时,只静态加载能保证程序运行的基本类,其他类在需要的时候再动态加载。所以说,动态加载比静态加载更加节省内存空间。

从程序灵活性的角度来看

  动态加载在程序运行时才加载,这就意味着我们可以在程序运行时对类文件的源代码进行修改。假如我们现在有一个网站,这个网站全部使用静态加载。然后有一天网站需要添加新的功能,我们在修改完源代码之后,需要重新编译源码,重启服务器,这个重新编译的过程可能是漫长的,期间网站无法提供服务。
  如果我们使用动态加载呢,我们在设计网站之前,就把之后可能会修改的代码,使用动态加载来加载。当我们需要添加或修改需求时,只需要修改对应部分的源代码,程序需要加载的时候,就自动加载了,完全不需要重新编译所有源码、重启服务器。所以说,动态加载带来了更大的程序灵活性。

下面我们通过代码来对比一下静态加载和动态加载:

//静态加载
    ①Student stu = new Student();
//调用stu的方法...
    
//动态加载
    ②Class s = Class.forName("RPC.v2.myTest01.Student");
    ③Object o = s.newInstance();
    ④Student stu = (Student)o; 
//调用stu的方法...    

  • 第1行代码,是静态加载,在main函数执行时,Student类是必须已经写好。

  • 第234行代码,是典型的动态加载。

    • 第2行,调用系统的Class对象的静态方法forName,需要传入一个字符串常量,这个字符串需要是包名+类名,(比如说我的Student文件路径src/RPC/v2/myTest01/Student.java,这个字符串应该为RPC.v2.myTest01.Student。)只需要在classPath路径下存在Student.java,且包名为RPC.v2.myTest01即可运行成功。

    • 第3行,调用类对象s的newInstance方法,创建对象。其内部是调用了装载这个类的无参构造器。

    • 第4行,强制转型成为我们要用到的类。

posted @ 2022-08-10 15:28  classic123  阅读(96)  评论(0编辑  收藏  举报