日期:2014-05-20  浏览次数:20616 次

有关JAVA中反射的实用性的疑问--好处究竟体现在哪里
在博客上看到JAVA中反射中有如下功能:

Java反射机制提供如下功能: 

在运行时判断任意一个对象所属的类 
在运行时构造任意一个类的对象 
在运行时判段任意一个类所具有的成员变量和方法 
在运行时调用任一个对象的方法 
在运行时创建新类对象 


那么,疑问如下:
1 运行时判断任意一个对象所属的类
在软件中可以体现在哪些方面?个人的理解是防止对象初始化错误(说错了别笑话~~)

2 运行时构造任意一个类的对象
任意一个类的对象完全可以NEW出来。与NEW操作相比,反射的优势体现在哪里?有没有劣势?

3 运行时判断/调用任意一个类所具有的成员变量和方法
疑问同第2个。

4 运行时创建新类对象
这个没看明白是什么意思。请指教。


------解决方案--------------------
反射的缺点:
1,丧失了编译时类型检查的好处
2,执行反射访问所需代码笨拙冗长
3,性能损失

反射一般为了基于组件的应用创建工具而设计的,这些工具需要根据需要装入类,反射功能只是在设计时被用到,普通应用程序不应该是反射方式访问对象,还有一些情况是编译时无法获取需要的类,但是在编译时存在适当的接口或者超类,让程序可以引用.
还有一个规则:接口优先于反射机制
------解决方案--------------------
2 运行时构造任意一个类的对象
任意一个类的对象完全可以NEW出来。与NEW操作相比,反射的优势体现在哪里?有没有劣势?

很明显,new需要人显示的去编写代码,而使用反射则是一种自动化的工作,例如 
使用new: public Object function(String path){
if(path.equals("java.io.File")){
return new File("xxx");
}else if(path.equals("java.lang.Intager")){
return new Intager(0);
......}
使用反射 : public Object function(String path){
try{

return Class.forNmae(“xx”).Instance /*没用IDE,手工编写,调用方法可能不对 */
}catch(Exception e){
.....
}
}
很显然后者更简单,可扩张性更好。


3.运行时判断/调用任意一个类所具有的成员变量和方法
疑问同第2个。
这个在写框架中有比较广泛的使用,比如Hibernate。 Hibernate是如何将SQL查询出来的结果放进对象中的呢,其实就是调用pojo中的set方法,然而,hibernate不会知道你有多少属性,也不会知道有多少的set方法,这里就是使用反射回去到类中的方法,将执行相关的set方法将结果保存进对象。

4 运行时创建新类对象
这个没看明白是什么意思。请指教。
这个我的理解如2,在运行时创建对象。
------解决方案--------------------
补充:
对于特定的复杂的系统编程任务,反射很有必要,如果编写的程序必须要与编译时未知的类一起工作,就可以用反射仅仅来实例化对象,但不应该通过反射来访问对象,应该通过被实例化对象的接口或者父类来访问对象的方法,这就是接口优先于反射机制的含义 .....
------解决方案--------------------
举一个使用反射的场景示例,我需要加载一个类,但是此类的class文件不在类路径上,需要从其他地方获取,如网络或者其他文件,这个时候就需要自定义类加载器,以定制的方式把类的全限定名转换成一个Java class文件格式的字节数组,加载出来要访问该对象的方法怎么办,就通过加载得到的Class对象通过反射来访问了,这种情况下普通程序无法完成.