Java进阶-反射

236 阅读2分钟

一、什么是反射

一句话概括:反射就是在运行时把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, "李四");