一、什么是反射
一句话概括:反射就是在运行时把Java类(Class)中的各种成分映射成一个个对象。
例如:一个类的元数据有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
二、Java反射机制提供的功能
- 在运行时构造任意一个类的对象
- 在运行时获取任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法和属性
正常类的加载过程:
反射的过程:
三、Class反射的使用
以Person对象为例
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("执行设置方法" + name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private void say(String str) {
System.out.println("说话啦:" + str);
}
}
反射获取Class对象的三种方式
- 直接获取:
Class<Person> aClass = Person.class
- 通过对象的实例获取:
Person person = new Person(); Class<Person> aClass = person.getClass();
- 通过类的全限定名获取:
Class<Person> aClass = (Class<Person>) Class.forName("com.changan.demo.Person");
反射获取构造方法
- 获取所有的构造方法
Constructor<Person>[] constructors = (Constructor<Person>[]) aClass.getConstructors();
- 获取指定的构造方法
Constructor<Person> constructor = aClass.getConstructor(String.class, int.class);
反射获取方法
- 获取所有的方法包括父类方法
Method[] methods = aClass.getMethods();
- 获取当前类声明的方法
Method[] declaredMethods = aClass.getDeclaredMethods();
- 获取指定方法
Method setName = aClass.getDeclaredMethod("setName", String.class);
反射执行方法
Person person1 = aClass.newInstance();
setName.invoke(person, "张三");
反射获取属性
- 获取所有的属性
Field[] fields = aClass.getFields();
- 获取当前类声明的属性
Field[] declaredFields = aClass.getDeclaredFields();
- 获取指定属性
Field name = aClass.getDeclaredField("name");
反射设置属性值和获取属性值
- 获取属性值
//操作私有属性或方法时,必须setAccessible(true)
name.setAccessible(true);
Object o = name.get(person);
System.out.println("获取变量值");
System.out.println(o);
- 设置属性值
name.setAccessible(true);
name.set(person, "李四");