在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
获取Class对象的方式:
调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如:
MyObject x;
Class c1 = x.getClass();
使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如:
Class c2=Class.forName(“类名或接口名”);
通过类加载器获取类对象,例如:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class cl1 = loader.loadClass("类名");
Class类的重要方法如下:
反射类通过Class类对象来获取,主要包括构造函数、成员变量、类方法,通过反射类对象可以实例化目标类、调用目标类对象的方法、操作目标类对象的域。
一个普通的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 {
//1、通过类装载器获取类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("top.sunjing98.reflect.Student");
//2、通过类对象获取构造器对象,通过构造器对象实例化类
Constructor constructor = clazz.getDeclaredConstructor( null);
Student s = (Student) constructor.newInstance();
//3、通过类对象获取方法对象,通过反射方法设置属性
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();
}
}
输出:
stuName: 张三 stuAge: 23
原文:https://www.cnblogs.com/lykxbg/p/11810765.html