反射概述
反射(reflection library)提供了一个非常丰富工具集,以便编写能够动态操纵Java代码的程序。它是Java组件的体系结构。使用反射功能可以使得Java可以操作任意一个类,包括类的所有属性和方法,对于任意一个对象也可以去调用内部的属性和方法,这种动态获取类和对象属性的功能被称为反射机制。
反射机制又被称为框架设计的灵魂
Class类
在Java中要想通过反射来操作一个类首先要获得这个类的.class字节码文件,而在Java.lang包下就提供了一个Class类,用于将获取到每一个字节码文件对应的Class类型的对象,然后再使用反射机制的方法对其进行操作。
Class类构造器是私有的,所以只能通过forName()实例化这个对象
forName()方法
forName()方法的参数名称要写类的完整包路径。该方法只能用于获取引用类型的类类型对象。
Class<?> cl = Class.forName("java.lang.String");
System.out.println(cl.getName()); //打印为java.lang.String
也可以根据数据类型进行包路径的获取
String type = "char";
Class cl = type.getClass(); //获取类的字节码文件
System.out.println(cl.getName()); //打印为java.lang.String
Class获取自定义类对象的方式
- Class.forName(“类路径”),获取字节码文件返回Class对象
- 类名.class,通过类名的属性class获取
- 自定义对象.getClass(),getClass()方法是继承超类Object的
//通过Class.forName()方法
Class cl = Class.forName("reflect.User");
System.out.println(cl);
//通过自定义类名.class
Class cl2 = User.class;
System.out.println(cl2);
//通过对象.getClass()
User user = new User();
Class cl3 = user.getClass();
System.out.println(cl3);
输出结果:
三种方式都可以获取到自定义User类的全类路径
Class对象的功能
Class对象主要用于以下三种操作
- 获取成员方法
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
- 获取构造方法
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
- 获取成员方法
Method getMethod(String name, Class<?>... parameterTypes)
Method[] getMethods()
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[] getDeclaredMethods()
获取成员属性
通过以上三种方法操作指定对象的成员方法
首先定义一个User用户类,使用lombok提供构造和getset方法
@AllArgsConstructor //全参构造
@NoArgsConstructor //无参构造
@Data //get&set方法
@ToString //toString
public class User {
//定义两个成员变量,为了方便后面测试,先将成员属性用public修饰
public String name;
public Integer age;
}
创建一个demo测试类操作User对象的成员变量
getField()
public class