反射

什么是反射

  • 程序运行时,对一个类的class文件,进行解剖,获得成员方法,成员变量,构造方法, 运行这些方法
  • 反射的目的,增强程序的扩展性

获得class文件,class是一个对象

有三种方法获取class文件对象
- 通过对象获得getClass()
- 通过类的静态属性获得class
- 通过Class类的静态方法获得classByName(String name)

第一种:对象.getClass()
第二种:类.class()
第三种:Class.ByName()

获取了Class文件对象后,就需要使用它

  • 获取构造方法
    getConstructors()返回数组,所有的公共的
    getDeclaredConstructors()返回数组,所有的,包含私有的
import java.lang.reflect.Constructor;

public class Demo {

    public static void main(String[] args) {
    //得到所有的构造函数,不包括私有
       Constructor[] p = new Person().getClass().getConstructors();
       for(Constructor con: p) {
        System.out.println(con);
       }
        //得到所有的构造函数,包括私有
        Constructor[] p = Class.forName("Person").getDeclaredConstructors();
       for(Constructor con: p) {
        System.out.println(con);
       }

    }
}

class Person {
    private String name = "";
    public int age;

    public Person() {
        System.out.println("无参构造函数");
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造函数");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 创建对象,用newInstance()
public class Demo {

    public static void main(String[] args) throws Exception {
       Person person = Class.forName("Person").newInstance();
       System.out.println(perosn.getName());

    }
}

class Person {
    private String name = "";
    public int age;

    public Person() {
        System.out.println("无参构造函数");
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造函数");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 获取成员属性
    getFields()获取所有的成员变量,返回数组,只是公有的
    getDecalredFields()获取所有的成员属性,包括私有的
    使用Field类中的方法set()修改成员变量的值
import java.lang.reflect.Field;

public class Demo {

    public static void main(String[] args) throws Exception {
       Field[] field = Class.forName("Person").getFields();
       for(Field fd: field) {
           System.out.println(fd);
       }
       Field[] field2 = Class.forName("Person").getDeclaredFields();
       for(Field fd: field2) {
           System.out.println(fd);
       }
    }
}
  • 获取成员方法,并运行
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

public class Demo {

    public static void main(String[] args) throws Exception {
        //返回所有方法,包括继承的、公有的
       //Method[] method = Class.forName("Person").getMethods();

       //返回所有的方法,包括公有的、私有的,不包括继承的
       //Method[] method = Class.forName("Person").getDelaredMethods();

       Class clazz = Class.forName("Person");
       Constructor con = clazz.getConstructor(String.class,int.class);
       Object person = con.newInstance("ok",24);
       Method get = clazz.getMethod("getName");
       Method set = clazz.getMethod("setName",String.class);
       System.out.println(get.invoke(person));
       System.out.println(set.invoke(person,"ok-change"));
       System.out.println(get.invoke(person));
    }
}

class Person {
    private String name = "";
    public int age;

    public Person() {
        System.out.println("无参构造函数");
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造函数");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

你可能感兴趣的:(Java学习)