java的反射机制


java的反射机制



一、获取类对象的三种方式


一、反射的引入
•Class类是Java 反射机制的起源和入口
•用于获取与类相关的各种信息
•提供了获取类信息的相关方法
•Class类继承自Object类
编译时知道类或对象的具体信息,此时直接对类和对象进行操作即可,无需反射(reflection)
如果编译不知道类或对象的具体信息,此时应该如何做呢?使用反射来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息

在这之前我们想要讲一下获取类对象的三种方式:
java的反射机制
其中类名.class、对象名.getClass()方式在编码时已经知道了要操作的类,而Class.forName()方式在操作的时候,可以知道,也可以不知道要操作的类。所以当编码时还不知道要操作的具体类,就只能使用Class.forName()方式了。
类名.class的好处在于不仅可以应用于普通的类、接口,还可以获取基本数据类型、数组的Class对象信息。


二、使用反射创建对象


利用反射机制来创建对象:
1.调用无参数构造方法创建对象
•方法1:通过Class的newInstance()方法
•方法2:通过Constructor的newInstance()方法

2.调用有参数构造方法创建对象:
通过Constructor的newInstance()方法创建对象

第一种:调用无参数的构造器java的反射机制
结果是:java的反射机制
第二种:使用有参数的构造器
java的反射机制
结果是:java的反射机制
第三种:使用全类名的方式 也是比较常见的一种在以后的spring xml中还有些框架中使用的比较多java的反射机制
结果是:java的反射机制
**

注意:

**
如果构造器不是public的时候就要加上下面这句话:
如果构造器是的话就加上getDeclaredConstructor 并设置set
如果是方法的时候就加上getDeclaredMethod
如果是属性的话就加上getDeclaredField

**

三、总结

**
反射优点
功能强大
1)编码时不知道具体的类型,可以使用反射动态操作
2) 突破封装的限制,即使private的成员也可以进行操作
反射缺点:
1).代码繁琐,可读性差
2).突破封装的限制,即使private的成员也可以进行操作(既是优点也是缺点)