动态装载以及对反射机制的理解
一、在最开始学习编程的时候,写的代码可以说是都是硬编码,而且是最简单的那种函数(方法)的实现也是硬
编码,比如把一个函数里面的参数都自己指定了大小,不懂得使用传入参数来动态改变数组长度啊,这样一些一
经过定义就确定的东西,这样的代码就是最初始学习编程的时候写过的最硬的硬编码了。后来学会了使用参数啊
、方法返回值啊之类的来动态规定接下去的程序的执行顺序,以此来避免代码变死编码的问题。就这样沾沾自喜
了接近一年后,今天才知道了代码还可以使用一种叫做动态装载的技术来实现程序运行时的动态装载,说成装载
,我更倾向于说成修改,因为它的目的无非就是实现在程序运行不中断的前提下修改程序,只是区别于硬编码的
是:硬编码要修改就得停止运行程序,修改完之后还得重新编译并运行程序;而动态的代码则是在运行过程中实
现修改目的,而不用停止程序重新编译。这样的话,如果一个程序系统很大很大的时候,就不用浪费时间在重新
运行上,而且能实现运行中更新程序的目的,也避免了用户数据和时间的错乱和浪费,这无疑是理想的。
多说无益,还是用代码来解释比较清晰。
package Dclass;
//学习接口
public interface learn {
void study();
}
package Dclass;
//学生类实现学习接口
public class Student implements learn{
public void study() {
System.out.println("我是一个学生,在学习中。。。");
}
}
package Dclass;
public class test {
//主函数
public static void main(String[] args) throws ClassNotFoundException, Exception,
IllegalAccessException {
// 硬编码
Student student = new Student();
student.study();
// 动态装载编码
String s = "Dclass.Student";
Class c = Class.forName(s);//必须传入一个字符串,不能直接传入结构名字或类名字
Object obj = c.newInstance();
learn Dstudent = (learn)obj;
Dstudent.study();
}
}
上面的代码定义了一个learn的接口,里面有一个study方法,Student类实现了learn接口,并分别展示了静
态绑定和动态装载两种机制来实现对象的创建,两者的区别就在于静态绑定的机制必须在Student类已经存在并
编译通过才能开始程序,而动态装载机制则只需要类名字来装载类对象,适当设计的程序可以实现在原来程序运
行过程中动态添加需要的类后加载到程序中运行,比如使用循环来获得用户输入的类名字,再确定加载哪一个类
对象,这样就不必停止程序而去修改并重新编译所有代码了。
二、而对于反射机制的解释无非就两个字而已,就是回溯。打个比方,我们以前写代码的时候思路都是从上到下
的,就像一棵树,从根节点到叶子节点,一层一层往下找。而放射机制就是提供了一些技术让我们可以从叶子节
点往上找到根节点。以前是用类对象可以拿到其中的一个具体实例的属性方法之类的,也就是对象里面的所有东
西,反射就是允许你拿到一个类的实例的时候能够获取其往上的东西,比如说它的类中的方法啊,属性等信息。
简单地说就像链表一样,我们以前只想着链表是单向的,现在反射机制就是提供了链表的另一个方向的路径,使
它变成了双向链表了,至于变成双向的链表之后,它有什么新应用想必大家都有自己的奇思妙想的。