类的动态装载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行,强制转型成为我们要用到的类。
-