1. Java反射的概念和提供的功能
(1)概念
在Java运行时的环境中,动态获取类的信息以及动态调用对象的方法的功能叫反射机制(Reflection)
(2)反射提供的功能
1)在运行时判断任意一个对象所属的类
2)在运行时构造任意一个类的对象
3)在运行时判断任意一个类所具有的成员变量和方法
4)在运行时调用任意一个对象的方法
2. Java反射实现层面提供的API
(1)Java反射提供的类所在的包是:
java.lang.reflect
(2) 具体的类包括如下:
Class类:代表一个类(注意:Class类位于java.lang包下);
Field类:代表类的成员变量;
Method类:代表类的方法;
Constructor类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
3. 三种方法获取Class对象
(1)方法一:Class类提供的静态方法:forName(String className),其中参数className表示包括包路径的完整类名
(2)方法二:利用类名.class这个方式
(3)方法三:利用Object类提供的方法:getClass()
(4)以上三种方法的代码实例如下:
4. 获取成员变量对应的Field对象
Class类提供的获取类的成员变量对应的Field对象的方法如下:
1)Field getDeclaredField(String name):根据传入的变量名称返回此Class对象所表示的类或接口中声明的变量对应的Field对象。
2)Field[] getDeclaredFields():返回一个Field类型的数组,包含此Class对象所表示的类或接口中声明的所有变量的Field对象。
3)Field getField(String name):根据传入的变量名返回一个Field对象,注意与getDeclaredField(String name)不同的是,此方法返回的是public变量对应的Field对象。
4)Field[] getFields():返回一个Field类型的数组,注意与Field[] getDeclaredFields()方法不同的是,此方法返回的是所有public变量对应的Field对象。
代码实例如下:
输出结果是:
------获取Boolean类中声明的所有成员变量的Field对象的数组--------
public static final java.lang.Boolean java.lang.Boolean.TRUE
public static final java.lang.Boolean java.lang.Boolean.FALSE
public static final java.lang.Class java.lang.Boolean.TYPE
private final boolean java.lang.Boolean.value
private static final long java.lang.Boolean.serialVersionUID
-------获得Boolean类中声明的public成员变量的Field对象的数组---------
public static final java.lang.Boolean java.lang.Boolean.TRUE
public static final java.lang.Boolean java.lang.Boolean.FALSE
public static final java.lang.Class java.lang.Boolean.TYPE
5. 利用反射获取类对应的Method对象
Class类提供了以下方法来获取类中的方法对应的Method对象:
1)Method getDeclaredMethod(String name, Class<?>... parameterTypes):返回一个Method对象,参数name表示方法名,可变参数parameterTypes是一个Class对象的数组,代表方法的参数的Class类型;
2)Method[] getDeclaredMethods():返回Method对象的一个数组,这些对象反映此Class对象所表示的类或接口声明的所有方法,包括公共、保护、默认访问和私有方法,但不包括继承的方法;
3)Method getMethod(String name, Class<?>... parameterTypes):返回一个Method对象,注意和此Method对象对应的方法是公共(public)方法;
4)Method[] getMethods():返回一个Method数组,这些对象反映此Class对象所表示的类或接口中声明的公共(public)方法(也包括父类或父接口中声明的public方法)。
代码实例如下:
6. 利用反射机制调用自定义的对象的方法
Java反射机制可以在运行时动态调用类中的方法。具体步骤包括:
1)首先要创建一个对象,通过类的Class对象来创建它所代表的类的实例
2)通过Class对象我们还能获得类中声明的方法的Method对象
3)Method类提供了Invoke方法来调用此Method对象所表示的方法
代码实例如下:
输出结果是:
计算得到的结果是: 3.3
打印出来的信息是:additionnal info: beautiful
7. 反射的优劣势
反射机制是一种程序自我分析的能力。用于获取一个类的类变量,构造函数,方法,修饰符。但是它的优劣势如下:
优点:运行期类型的判断,动态类加载,动态代理使用反射。
缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。
本文暂时没有评论,来添加一个吧(●'◡'●)