Java 反射

什么是反射

反射就是把java类中的各种成分映射成一个个的Java对象。

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

反射类的构造以及获取相关信息

package demo1;

import java.io.Serializable;

public class Person implements Serializable {
    public String name;
    private int age;

    public Person(){
        this.name = "Default";
        this.age = -1;
    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    private void action(String act){
        System.out.println(act);
    }
}

构造

有两种构造方式,一种是使用Class对象的newInstance方法,这种方法只能无参构造

                Person p = new Person("FlowerYang", 20);
                Class c = p.getClass();
                c.newInstance();

另一种方法是先生成一个Constructor再构造,这种方法可以带参数

        Person p = new Person("FlowerYang", 20);
        Class c = p.getClass();
        Constructor con = c.getConstructor(String.class, int.class);
        Person p1 = (Person)con.newInstance("P3ngu1nW", 20);

获取属性信息

使用getFields来获取public属性的信息,getDeclaredFields来获取所有属性的信息

通过getFieldgetDeclaredField来获取单个属性的信息

要获取某个对象的某个属性的值,需使用get方法,对于private的属性需setAccessible(true)

        Field[] F = c.getDeclaredFields();
        for (Field f:F){
            f.setAccessible(true);
            System.out.println(f.get(p1));
        }

修改属性信息

        Field namefield = c.getField("name");
        namefield.set(p1, "FlowerYang");
        Field agefield = c.getDeclaredField("age");
        agefield.setAccessible(true);
        agefield.set(p1, 18);

通过set方法,注意对于private的属性需setAccessible(true)

获取属性方法

和获取属性信息的做法类似

        Method[] M = c.getMethods();
        for (Method m:M){
            System.out.println(m);
        }

调用属性方法

类似构造的方法

        Method m = c.getDeclaredMethod("action", String.class);
        m.setAccessible(true);
        m.invoke(p1, "Hello World!");