在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。java
获取Class对象的方式:git
调用Object类的getClass()方法来获得Class对象,这也是最多见的产生Class对象的方法。例如:
MyObject x;
Class c1 = x.getClass();github
使用Class类的中静态forName()方法得到与字符串对应的Class对象。例如:
Class c2=Class.forName(“类名或接口名”);函数
经过类加载器获取类对象,例如:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class cl1 = loader.loadClass("类名");this
Class类的重要方法以下:code
反射类经过Class类对象来获取,主要包括构造函数、成员变量、类方法,经过反射类对象能够实例化目标类、调用目标类对象的方法、操做目标类对象的域。对象
https://github.com/kaname233/SpringLearn/tree/master/src/top/sunjing98/reflect
一个普通的Java类Student:
接口
package top.sunjing98.reflect; public class Student { private String stuName; private int stuAge; public Student() { } public Student(String stuName, int stuAge) { this.stuName = stuName; this.stuAge = stuAge; } public void introduce() { System.out.println("stuName: " + stuName + " stuAge: " + stuAge); } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public int getStuAge() { return stuAge; } public void setStuAge(int stuAge) { this.stuAge = stuAge; } }
经过反射机制建立并操做目标类对象:字符串
package top.sunjing98.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectTest { public static Student initByDefaultConst() throws Throwable { //一、经过类装载器获取类对象 ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class clazz = loader.loadClass("top.sunjing98.reflect.Student"); //二、经过类对象获取构造器对象,经过构造器对象实例化类 Constructor constructor = clazz.getDeclaredConstructor( null); Student s = (Student) constructor.newInstance(); //三、经过类对象获取方法对象,经过反射方法设置属性 Method setStuName = clazz.getMethod("setStuName", String.class); Method setStuAge = clazz.getMethod("setStuAge", int.class); setStuName.invoke(s, "张三"); setStuAge.invoke(s, 23); return s; } public static void main(String[] args) throws Throwable { Student s = initByDefaultConst(); s.introduce(); } }
输出:get
stuName: 张三 stuAge: 23