1.什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
在 Java 程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如:
Person p=new Student();
其中编译时类型为 Person,运行时类型为 Student
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁.
java反射主要提供以下功能:
(1) 在运行时判断任意一个对象所属的类;
(2) 在运行时构造任意一个类的对象;
(3) 在运行时判断任意一个类所具有的成员变量和方法(通过反射可以调用 private方法);
(4) 在运行时调用任意一个对象的方法;
重点: 在运行时而不是在编译时
反射最重要的用途就是开发各种通用框架.
2.反射的基本应用
(1) 获得Class 对象的3种方法
//1.通过Class类的静态方法forName
Class<?> clazz = Class.forName("java.lang.Integer");
System.out.println(clazz);
//2.直接获取一个对象的class
Class<?> clazz1 = int.class;
Class<?> clazz2 = Integer.TYPE;
//3.通过某个对象的 getClass() 方法
Integer c = new Integer(5);
Class<? extends Integer> clazz4 = c.getClass();
(2) 判断是否为某个类的实例
一般地,我们用 instanceof 关键字判断是否为某个类的实例,同时我们也可以借助反射中 Class 对象的 isInstanceof() 方法来判断是否为某个类的实例, 它是以native方法:
(3) 创建实例
//1. 使用Class对象的 newInstance() 来创建Class对象对应的实例
Class<?> clazz = Student.class;
Object o = clazz.newInstance();
System.out.println(o);
//2. 先通过Class对象获取指定的Constructor对象,再调用Constructor对象
//的newInstance()来创建实例,这种方法可以用指定的构造器构造类的实例
Constructor<?> constructor = clazz.getConstructor(String.class);
Object x = constructor.newInstance("小雨");
System.out.println(x);
(4) 获取方法
获取某个Class对象的方法集合,主要有以下几个方法:
- getDeclaredMethods 方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
- getDeclaredMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。
- getMethods 方法返回某个类的所有公用(public)方法,包括其继承类的公用方法。
- getMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。
(5) 获取构造器信息
主要是通过Class类的getConstructor方法得到Constructor类的一个实例,而Constructor类有一个newInstance方法可以创建一个对象实例,此方法可以根据传入的参数来调用对应的Constructor创建对象实例。
(6) 获取类的成员变量信息
主要有以下几个方法: