通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法
 *
 * @author silence
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {
        //获得字节码文件
        Class<?> clazz = Class.forName("operate425.operate.operate3.User");
        //通过反射获得user对象
        User user = getMethod1(clazz);
        //通过反射给私有的属性设置值
        setField(user, clazz);
        //打印私有化方法
        Method getMethod = clazz.getDeclaredMethod("get");
        getMethod.setAccessible(true);
        getMethod.invoke(user);

    }

    /**
     * 通过反射给私有的属性设置值
     *
     * @param user  user
     * @param clazz clazz
     */
    private static void setField(User user, Class<?> clazz) throws Exception {
        //获得成员变量引用并设置值
        Field username = clazz.getDeclaredField("username");
        //突破成员变量private 限制
        username.setAccessible(true);
        //获得password属性应用
        Field password = clazz.getDeclaredField("password");
        //突破成员变量private 限制
        password.setAccessible(true);
        //给成员变量设置属性值
        username.set(user, "通过反射设置username值");
        password.set(user, "通过反射设置password值");
        //打印user对象
        System.out.println(user);
    }

    /**
     * 通过反射获得user对象
     *
     * @param clazz clazz
     * @return User
     */
    private static User getMethod1(Class<?> clazz) throws Exception {
        //获得private 修饰的构造方法
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);
        //突破构造方法private限制
        declaredConstructor.setAccessible(true);
        //创建user对象
        User user = (User) declaredConstructor.newInstance("构造方法实参");
        //打印user对象
        System.out.println(user);
        return user;
    }
}

class User {
    private String username;
    private String password;

    private User(String name) {
        System.out.println("user私有有参构造获得的形参:" + name);
        System.out.println("user私有构造被调用");
    }

    private void get() {
        System.out.println("user私有化get方法被调用");
        //打印成员变量
        System.out.println("user私有化get方法:" + username);
        System.out.println("user私有化get方法:" + password);
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Silence丶你的名字

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

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

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

打赏作者

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

抵扣说明:

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

余额充值