1.Class类:
有了元对象,Reflection也成了一件顺其自然的事情。有了Reflection,Java也就拥有了动态扩展的能力,这样就可以极大的提高程序的灵活性。
1.1 new和newInstance:
new关键字是强类型的,效率相对较高。
newInstance()是弱类型的,效率相对较低。
而句柄是可以动态载入的,实际上JVM内部也是这样加载类的。该方法创建对象的时候, 只会调用该类的无参数构造函数,不会调用其他的有参构造函数。
new 后面接类名参数,是最常见的创建实例的方式。这是必须要知道一个明确的类才能使用
假设定义了一个接口Door,开始的时候是用木门的,定义为一个类WoodenDoor,在程序里就要这样写 Door door = new WoodenDoor() 。假设后来生活条件提高,换为自动门了,定义一个类AutoDoor,这时程序就要改写为 Door door = new AutoDoor() 。虽然只是改个标识符,如果这样的语句特别多,改动还是挺大的。于是出现了工厂模式,所有Door的实例都由DoorFactory提供,这时换一种门的时候,只需要把工厂的生产模式改一下,还是要改一点代码。
而如果使用newInstance(),则可以在不改变代码的情况下,换为另外一种Door。具体方法是把Door的具体实现类的类名放到配置文件中,通过newInstance()生成实例。这样,改变另外一种Door的时候,只改配置文件就可以了。示例代码如下:
String className = 从配置文件读取Door的具体实现类的类名;
Door door = (Door) Class.forName(className).newInstance();
再配合依赖注入的方法,就提高了软件的可伸缩性、可扩展性。
Class.forName(String className)这个方法传入一个类型的全路径的名字(也就是带包的完整名字),会返回一个字节码类型(也就是Class类型)的实例
如:Class clazz = Class.forName("com.dean.Person");
然后再用这个字节码类型的实例clazz调用newInstance()方法会返回一个Object类型的对象
如下:Object object = clazz.newInstance();
这个object当然不能直接调用Perosn类的方法了,因为他是Object类型
这个时候就需要强制类型转换了
Person person = (Perosn)clazz.newInstance();
1.2:Field??
关于获取类的字段有两种方式:getFields()和getDeclaredFields()。我们先来看看这两者的区别吧:
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
优秀文件链接:http://blog.csdn.net/disiwei1012/article/details/53022321
在Java的反射机制中,
通过 数组的 class 对象的getComponentType()
方法可以取得一个数组的Class对象, 通过Array.newInstance()
可以反射生成数组对象,看示例代码:
优秀连接文章:1:http://blog.csdn.net/gudu1289/article/details/46638495。2:http://blog.csdn.net/dean_deng/article/details/44726083 3:http://www.cnblogs.com/yrstudy/p/6500982.html; 4:http://blog.csdn.net/claram/article/details/53412256