Java 反射相关思考

动态反射,之前一直理解为只要有.class文件就可以调用。其实这里准确的说,应该是运行中的对象和类就能够获得。
当然,.class文件也可以在加载进内存后,然后再反射调用。

 Person accpTeacher = (Person) Class.forName("edu.qust.demo.Person")  
                    .newInstance();//获取实例  双引号里面前半部分是包名,后半部分是对象名称

这里这个对象好像只是单纯创建了个新的对象,有个问题就是如何获取内存中已经存在的对象。
如果获取存在的对象直接找句柄啊,这里秀逗了。重点是找私有对象。

        person = new Person("Zhao");
        cls = (Class<Person>) person.getClass();
        Method method = cls.getDeclaredMethod("showName", String.class);
        // 若调用私有方法,必须抑制java对权限的检查  
        method.setAccessible(true);  
        // 使用invoke调用方法,并且获取方法的返回值,需要传入一个方法所在类的对象,new Object[]
        // {"Kai"}是需要传入的参数,与上面的String.class相对应
        String string = (String) method.invoke(person,new Object[] { "Kai" });
        System.out.println(string);

获取了私有对象之后,我们就可以根据代码逻辑,替换对象中的字段或列表,实现代码Hook。这应该就是反射hook的精髓。

由于JDK动态代理只支持接口,而这个Instrumentation是一个类,没办法,我们只有手动写静态代理类,覆盖掉原始的方法即可。(cglib可以做到基于类的动态代理,这里先不介绍)
Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值