java中的反射学习
java被称为准动态语言很大一部分是因为java的反射机制。
运行程序,要经历编译成class文件,然后被类加载器加载,经过一系列操作才能被JVM运行,在被类加载器加载时会生产一个Class对象,里面有该类的参数,方法,构造器等信息。
我们可以通过获取这个Class对象来获取里面的信息,并且一个类只会有一个Class对象。
1、获取Class对象的方式有三种
public class Student { private String name; private int age; private String sex; public Student() { } public Student(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } }
1)通过对象.class的方式
2)通过实例化对象然后调用getClass方法
3)通过Class.forName()的方法
我们打印这三个studentClass的hashcode验证下是否是同一个Class对象:
2、获取构造方法
我们可以通过getConstructors方法来获取公共的构造方法,如果要获取私有的需要使用getDeclaredConstructors这个方法。
获取单个构造方法可以使用getConstructor这个方法,同理getDeclaredConstructor。
我们使用newInstance方法来创建对象。
无参:
有参:
私有的构造方法是无法被访问的我们要使用setAccessible(true);来使得能够正常被访问。
3、获取成员变量和使用
和获取构造方法相同我们使用getFields()和getDeclaredFields()方法来获取。
使用Field里面的set方法设置成员变量
4、获取成员方法和使用
和获取成员变量一样,获取成员方法我们使用
我们用反射使用成员方法时,使用invoke方法来使用,invoke(对象,参数)