什么是反射
反射的作用
1.获取类内部的信息(方法 属性 构造方法 包名 实现接口)
2.可以干常规手段不可以干的事( 强制给私有属性赋值 强制调用类内部的私有方法)
类对象
就是将一个Java类作为对象使用
获取类对象
简单代码展示:
//创建该类的实例
People p = new People();
//通过实例的getClass方法获取类对象
Class<? extends People> aClass01 = p.getClass();
//直接将类声明为创建的对象类型创建
Class<People> aClass02 = People.class;
//通过限定全名
Class<?> aClass03 = Class.forName("com.jsh.Day23.People");
aClass01 02 03本质都是People这个java类
获取类对象的各种属性
getPackage()
获取此类的包。
getName()
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
getInterfaces()
确定此对象所表示的类或接口实现的接口。
//获取该类对象所处的包名并展示
System.out.println("aClass02.getPackage().getName() = " + aClass02.getPackage().getName());
//获取其超类(即父类)的类型
System.out.println("aClass02.getSuperclass().getName() = " + aClass02.getSuperclass().getName() );
//获取其实现的接口 放入数组中
Class<?>[] interfaces = aClass02.getInterfaces();
//遍历数组
for (int i = 0; i < interfaces.length; i++) {
Class<?> anInterface = interfaces[i];
//输出其实现的接口
System.out.println("anInterface = " + anInterface);
}
通过类对象获取属性和方法
获取属性
/**
* getField(String name)
* 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
*
* getFields()
* 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
*
* getDeclaredField(String name)
* 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
*
*
* getDeclaredFields()
* 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
*/
已People类为例,设置公开属性名字,私有属性年龄 public String name; private int age;
私有属性只能通过getDeclaredField来访问
通过创建映射的方法修改People类中的对象属性
//创建类型为People的对象student
People student = new People();
//获得People类对象的公开属性名字
Field name = aClass02.getField("name");
//设置student对象的名字为小黄
name.set(student,"小黄");
//获取People中已声明的私有年龄
Field age = aClass02.getDeclaredField("age");
//强制该私有属性为可更改
age.setAccessible(true);
age.set(student,22);
System.out.println(student);
获取方法
/**
* 获取类对象中的方法
*
* getMethod(String name, Class<?>... parameterTypes)
* 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
* getMethods()
* 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
*/
在People中分别创建一个公开一个私有方法
创建映射获取方法并执行
//获取公开方法
Method sPublic = aClass02.getMethod("sPublic", String.class);
//使用该方法
sPublic.invoke(student,"我是公开方法");
//获取私有的方法
Method sPrivate = aClass02.getDeclaredMethod("sPrivate", String.class);
//强制修改使用该方法
sPrivate.setAccessible(true);
//使用studen对象执行该方法
sPrivate.invoke(student,"你好");
运行结果