标签:
反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
换一种引出反射的说法是:当通过反射与一个未知的类型的对象打交道是,JVM只是简单地检查这个类,看它是属于哪个特定的类(就想RTTI那样)。在用它做其他事情之前必须先加载那个类的Class对象。因此,那个类的.class文件对于JVM来说必须是可获取的;那么在本地机器上,要么通过网络获得。所以RTTI和反射之间真正的区别只在于,对于RTTI来说,编译器再编译的时候打开和检查.class文件。(换句话说,我们可以用“普通”方式调用对象的所有方法)而对于反射机制来说,.class文件在编译时时不可获得的,所以在运行时打开和检查.class文件。
举个项目例子来说:
我们在项目运行开始后,如果我们需要更改这个项目的某个地方的Dao的时候,根据我们设计模式的OCP原则:对增加开放,对修改关闭,所以我们是不会轻易的去修改代码的,因为我们一般都会用一个配置文件来设置我们项目需要的哪种Dao,如:
factory = shop.dao.PropertiesFactory
userDao = shop.dao.UserDao
addressDao = shop.dao.AddressDao
所以我们以后就能在这里修改我们需要的,并不需要去项目中修改代码,但问题来了,我们如果通过String来获得我们需要的类呢,这就是反射的起因之一。
Properties prop = PropertiesUtil.getDaoProp();
String fs = prop.getProperty("factory");
Class clz = Class.forName(fs);
String mn = "getInstance";
Method m = clz.getMethod(mn);
f = (IFactoryDao)m.invoke(clz);
这段代码中我们可以看到:Class clz = Class.forName(fs);我们通过Class.forName()方法便能得到一个类(其他看不懂可以看接下来我贴的中文sdk文档链接学习)。这样我们便能做到动态的获得一个类了,这也就是反射机制的好处之一。
java 反射机制:运行时的类信息(为框架服务的Bug存在)
标签:
原文地址:http://blog.csdn.net/u011345136/article/details/43926929