import operate425.demo.demo1.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/**
* 通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值
*
* @author silence
*/
public class ClassFile {
public static void main(String[] args) throws Exception {
//获得字节码文件
Class<?> clazz = Class.forName("operate425.demo.demo1.Student");
// 通过私有的构造,获取类 私有的单个属性值
// method1(clazz);
//获取公共的属性值 设置value 并获取值
// method2(clazz);
//获取所有的公共属性
// method3(clazz);
// 获取所有公共的和私有的属性
// method4(clazz);
}
/**
* 获取所有公共的和私有的属性
*
* @param clazz clazz
*/
private static void method4(Class<?> clazz) {
Field[] declaredFields = clazz.getDeclaredFields();
for (Field df : declaredFields) {
System.out.println(df);
}
}
/**
* 获取所有的公共属性
*
* @param clazz clazz
*/
private static void method3(Class<?> clazz) {
Field[] fields = clazz.getFields();
for (Field f : fields) {
System.out.println(f);
}
}
/**
* 获取公共的值
*
* @param clazz clazz
*/
private static void method2(Class<?> clazz) throws NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//通过公共的带参构造器获得构造引用
Constructor<?> constructor = clazz.getConstructor(String.class);
//创建对象
Student student = (Student) constructor.newInstance("张三");
//获取属性值的对象引用
Field password = clazz.getField("passwrod");
//给属性设置值
password.set(student, "这里是我设置的密码");
//获取属性值
String pas = (String) password.get(student);
System.out.println(pas);
}
/**
* 通过私有的构造,获取类 私有的属性值
*
* @param clazz clazz
* @throws Exception Exception
*/
private static void method1(Class<?> clazz) throws Exception {
//获得私有无参构造器
Constructor<?> constructor = clazz.getDeclaredConstructor();
//私有的构造器必须临时修改访问修饰符检测
constructor.setAccessible(true);
//通过构造器创建对象
Student student = (Student) constructor.newInstance();
//通过属性名, 获得属性引用
Field username = clazz.getDeclaredField("username");
//调用私有的属性 必须临时修改访问修饰符检测
username.setAccessible(true);
//获得属性应用的值
String name = (String) username.get(student);
//输出
System.out.println(name);
}
}
通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值
最新推荐文章于 2021-12-04 13:31:06 发布