暴力反射基础

获取私有属性

@Test
    public void getFie2() throws Exception {
        Class<?> clazz = Person.class;
        //获取指定的私有属性,注意要传入指定的参数名,而且要抛出异常
        Field field = clazz.getDeclaredField("name");
        System.out.println(field);
        //通过刚刚获取到的私有属性对象,查看他的类型
        System.out.println(field.getType());//class java.lang.String
        System.out.println(field.getType().getName());//java.lang.String

        /*设置属性值*/
        //需要指定到底是给哪个对象的name属性设置值
        Object obj = clazz.newInstance();

        //暴力反射,需要设置私有可见的权限
        field.setAccessible(true);

        //利用反射给刚刚获取到的字段对象设置属性值
        /*field就是我们刚刚获取到的name属性
        * set(m,n)---m是给哪个对象的name属性设置值,n是具体设置的值是什么*/
        field.set(obj, "海绵宝宝");
        //打印查看刚刚设置的属性值
        //field.get(m)---field表示的就是name属性,m代表刚刚给哪个对象设置值
        System.out.println(field.get(obj));
    }

    @Test
    public void getFie() throws Exception{
        Class<?> c = Person.class;
        Field f = c.getDeclaredField("age");
        Object o = c.newInstance();
        f.setAccessible(true);
        f.set(o, 18);
        System.out.println(f.get(o));
    }

获取并执行私有方法

  @Test
    public void getFunction2() throws Exception {
        Class<?> clazz = Person.class;
        //通过字节码对象获取对应的私有方法对象method,代表的就是save(int,String)这个方法
        Method method = clazz.getDeclaredMethod("save", int.class,String.class);
        //没有对象先通过反射创建对象
        Object p1 = clazz.newInstance();
        method.setAccessible(true);
        /*invoke(o,x,y,z...),表示通过反射技术给队友的对象执行指定的方法
        * o:指的就是对应的对象
        * x,y,z....:执行对应方法时需要传入的参数*/
        //通过方法对象调用invoke()执行私有方法
        method.invoke(p1, 666,"哈哈哈");
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值