通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值


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);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence丶你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值