一、反射的概念
Java反射(Reflection)就是java程序在运行时,可以加载、探知、使用编程期间完全未知的类。也就是说,java程序可以加载一个运行时才知道的类,获得类的完整构造方法等。这个功能就称为Java的反射机制。作为程序员,编写简单的Java程序时,使用反射机制的机会不多。反射机制一般在框架中使用的较多,因为框架要适用更多的情况,对灵活性要求比较高。
二、Class类
在JDK中,java.lang.reflect包提供了类和接口,以获得关于类和对象的反射信息。但是Class类在java.lang包中,不在java.lang.reflect包中,Class类继承自Object类,是java反射机制的入口,封装了一个类或接口的运行时信息,通过调用Class类的方法可以获取这些信息。
获取Class类的集中方法:
Class.forName()
类名.class
包装类.TYPE
对象名.getClass()
Class类.getSuperClass()
public static void main(String[] args) throws ClassNotFoundException {
//第1种
// 写类名的时候,要写全名:包名+类名。
Class c1 = Class.forName("java.lang.Object");
//第2种
Class c2 = String.class;
//第3种
Class c3 = Integer.TYPE;
//第4种
String str = new String(); //创建一个对象
Class c4 = str.getClass();
//第五种,必须使用Class类才能获取getSuperClass其对应对象父类的Class对象。
Class c5 = c1.getSuperclass();
}
常用方法:
获取构造方法(Constructot)的:
Constructor getConstructor(Class… parameterTypes) ,返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor [] getConstructors(),返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
Constructor [] getDeclaredConstructor(Class… parameterTypes),返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor [] getDeclaredConstructors(),返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
获取属性(Field)的:
Field getField(String name) ,返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields(),返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Field[] getDeclaredFields() ,返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
获取方法(Method)的:
Method getMethod(String name, Class … parameterTypes) ,返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods() ,返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法 。
Method getDeclaredMethod(String name, Class… parameterTypes) ,返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getDeclaredMethods() ,返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
其他方法:
static Class<> forName(String className),返回与带有给定字符串名的类或接口相关联的 Class 对象 。
T newInstance(),创建此 Class 对象所表示的类的一个新实例。
三、Constructor类
常用方法:
int getModifiers(),以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。
String getName(),以字符串形式返回此构造方法的名称。
Class<>[] getExceptionTypes(), 返回一组表示声明要抛出的异常类型的 Class 对象,这些异常是由此 Constructor 对象表示的底层构造方法抛出的。
Class<>[] getParameterTypes( ),按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。
T newInstance(Object… initargs), 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
四、Field类
常用方法:
Class<> getType(), 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
int getModifiers(),以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。
String getName(),返回此 Field 对象表示的字段的名称。
Class<> getType(),返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
void set(Object obj, Object value),将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
五、Method类
常用方法:
Class<>[] getExceptionTypes(),返回 Class 对象的数组,这些对象描述了声明将此 Method 对象表示的底层方法抛出的异常类型。
int getModifiers(), 以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。
String getName(),以 String 形式返回此 Method 对象表示的方法名称。
Class<>[] getParameterTypes(),按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
Class<> getReturnType(),返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。
Object invoke(Object obj, Object… args),对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。