反射系列传送门
一、获取普通方法的实例化对象
现有学生类如下:
public class Student {
public String name;
private String id;
}
1、获取所有public级别的属性,包括其父类
注意:getFields()方法返回的是一个Field类型的数组,存放有本类中和父类中访问权限为public的属性的实例化对象。
package test;
import java.lang.reflect.Field;
import test.Student;
public class Test {
public static void main(String[] args) {
Class clazz = Student.class;
Field field= clazz.getField("name");
System.out.println(field.getName());
}
}
2、获取本类中的属性
public class Test {
public static void main(String[] args) {
Class clazz = Student.class;
Field field= clazz.getDeclaredField("id");
System.out.println(field.getName());
}
}
二、获取信息
1、获取所在类
package test;
import java.lang.reflect.Field;
import test.Student;
public class Test {
public static void main(String[] args) {
Class clazz = Student.class;
try{
Field field= clazz.getField("name");
System.out.println(field.getDeclaringClass());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、获取访问控制权限
package test;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import test.Student;
public class Test {
public static void main(String[] args) {
Class clazz = Student.class;
try{
Field field= clazz.getField("name");
System.out.println(Modifier.toString(field.getModifiers()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、通过反射使用属性
通过反射使用set(Object obj,Object value)方法给属性赋值。
public class Test {
public static void main(String[] args) {
Class clazz = Student.class;
try{
Field field= clazz.getField("name");
Student student = new Student();//创建Student类对象用于使用反射思想调用Student类中的属性
field.set(student, "Tom");//将Student类型对象和将要赋给name的值作为参数传递给set()方法
System.out.println(field.get(student));//通过反射获取属性的值
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果属性使用private修饰那么就需要使用getDeclaredField()方法创建属性实例化对象,并且需要使用实例化对象.setAccessible(boolean flag)方法,设定调用构造函数时忽略访问权限的影响(true表示忽略,false表示不忽略)
public class Test {
public static void main(String[] args) {
Class clazz = Student.class;
try{
Field field= clazz.getDeclaredField("id");
field.setAccessible(true);
Student student = new Student();
field.set(student, "2019666");
System.out.println(field.get(student));
} catch (Exception e) {
e.printStackTrace();
}
}
}