反射概念:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
Class类:
类是具有相同属性或者行为的一类事物,那么类本身也可以再被抽象,因为类们也有共同属性和行为(比如类都有属性,都有构造器,都有方法,都能调用方法),所以把类们又抽象成了一个类Class。
众所周知Java有个Object类,是所有Java类的继承根源,其内声明了数个应该在所有Java类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。
Class类十分特殊。它和一般类一样继承Object,其实体用以表达Java程序运行时的classes和
interfaces,也用来表达enum、array、primitive Java types(boolean,byte,char, short,int, long, float,double)以及关键词void。当一个class被加载,或当加载器(classloader)的defineClass()被JVM调用,JVM 便自动产生一个Class对象。
在学习Class类的过程中我们还需要学习Field类,Method类,Constructor类
- Field类:类属性的抽象
- Method类:类方法的抽象
- Constructor类:类构造器的抽象
class类中要掌握的方法:
- 方法一:通过Class.forName("类的全路径");
- 方法二:通过类的名字打“.class”,如:Person.class;
- 方法三 :通过调用该类的对象调用getClass()方法;
- static Class<?>.forName(String className) : 返回与带有给定字符串名的类或接口相对应的Class对象。
- Field.getDeclaredField()(String name):返回一个field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段。
- Field[].getDeclaredFields():返回一个Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段。
- Method.getDeclaredMethod(String name,Class<?>...parameterTypes):返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法
- Method[].getDeclaredMethods():返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
- Constructor<T>.getConstructor(Class<?>... parameterTypes):返回一个Constructor对象,它反映此Class所表示的类的指定公共构造方法。
- Constructor<?>[].getConstryctors():返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法。
- T.newInstance():使用默认构造器创建此Class对象所表示的类的一个新实例
Method反射调用自身
Object.invoke(Object obj,Object... args) :对带有指定参数的指定对象调用由此Method对象表示的底层方法。
- 如果底层是实例方法,第一个参数就是该对象实例,第二个参数是方法的参数列表,invoke的返回值就是实例方法的返回值。
- 如果底层方法是静态的,那么可以忽略指定的obj参数。该参数可以为null。
- 如果底层方法所需的形参数为0,则,所提供的args数组长度可以为0或null。
Field类要掌握的方法
- Class<?>.getType():返回一个Class对象,它标识了此Field对象所表示字段的声明类型。
- String.getName():返回此Field对象表示的字段的名称。
- void.set(Object obj,Object value):将指定对象变量上此Field对象表示的字段设置为指定的新值。
Constructor类要掌握的方法
T.newInstance(Object... initargs):使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。