您的位置:首页 > 编程语言 > Java开发

对反射的思考——另一种抽象,另一种实现

2009-05-27 11:38 176 查看
反射实现了在程序运行时动态编译生存对象的一种机制。这个机制依赖对JAVA的类的一种抽象——即Class类。与Class类联系的其它类Method类、Field类、Constructor类、Modifier类等代表各种信息的类。书里面说,反射是在运行时通过获得运行对像的类信息,即Class对象,从而运行Class对象信息进行动态地操作。而在运行时对像的信息可以在编译的时候就知道的,那叫做RTTI,而反射是在运行时对对象的信息是没有预先知道的,而是通过获取对象类信息关联的类名,动态加载所需的类对象,以类对象进行各种的操作。甚至通过动态编译,生成类的字节码数组,再通过ClassLoader加载类对象。获得类对象之后,我们就可以用它生存各种Method对象、Field对象、Constructor对象、Modifier对象进行各种操作。反射,给我们带了新的一种编程方式,因为我们拥有了代表程序运行所需的对象的信息,在编写程序时,我们可以用Class类、Method类、Field类、Constructor类等这些类的实例去代表程序所需的对象、方法、属性。我们选择不选择显式地创建对象,可以选择不显式地调用方法,而用Class返回我们所需要的方法对象,用方法对象的invoke()方法,得到与显式调用方法一样的效果。因为以上这些类在是类的抽象、是方法的抽象、是字段的抽象,这些都是符号代表,代表着其可以在编程过程中更好地隐藏实现,就拿Method来说,invoke()方法代表着方法的调用。相对于显式调用来说,其灵活性大大增强,因为它只是代表方法的执行,对于执行怎样的方法,方法名是什么,参数是什么,这些都隐藏在背后的实现里,它只是一个执行的楷架。而显示调用方法,就已经确定了这个方法一定是某个对象的某个方法,尽管方法实现内容是可以改变,但是方法名就不能改变了。在维护代码的时候,显示调用就限制了灵活性。而Method类,可以说是所有方法的公共“接口”,它实例是每个类里面的各种各样的方法。它是抽象的、代号的,而各种具体的方法就是其具体的实现。它的设计思考有点像File类等包装类。把具体的实现包装起来,客户端(应用层)只面对一个抽象的包装对象,而里面的具体实现应用层是没办法知的。当然具体实现也决定了该包装类的具体行为,然后这种包装类的行为规范是统一的。能有效地利用反射相关的这些类,可以增加开发的灵活性,尤其重要的是,我们可以在程序运行时,改变程序的行为,当然这种行为必须是正当的。当我们有了选择的时候,就必须权衡两种方式的优缺点。利用反射,程序的灵活性增强了,但是这种灵活是要牺牲一定的效率的。显试调用能使程序的可读性增强,能够明确开发代码意图,也不会牺牲太大的效率。综合运用两种方式才能达到最佳的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息