Java 反射相关思考
程序员文章站
2024-03-19 12:13:10
...
动态反射,之前一直理解为只要有.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[])方法接收的参数必须为对象
上一篇: wnp
下一篇: [优化] 十行代码完成斐波数列算法优化
推荐阅读
-
Java 反射相关思考
-
JAVA虚拟机-Java体系结构及hotspot介绍(一) 博客分类: JVM相关 jvm虚拟机hotspot
-
(转)用jdom轻松整合java和xml 博客分类: XML相关 XMLJavaASP.netOracleASP
-
疯子在思考之从零说MVC-2 博客分类: JAVA mvcstruts开源框架spring mvc3
-
Java中16进制数与Byte的相互转换及其相关
-
Java NIO与IO 博客分类: java相关 javaNIOIO
-
java反射机制概述以及简单实现 博客分类: JDK//Demo java反射orm实现原理ioc实现原理
-
java利用reflectasm反射 博客分类: Java reflectasmjava反射
-
java利用reflectasm反射 博客分类: Java reflectasmjava反射
-
问题排查之OOM (非原创,来自于同事的邮件分享) 博客分类: Java相关 OOMNIO