加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何在类加载时调试注入VM的字节码?

发布时间:2020-12-15 02:22:21 所属栏目:Java 来源:网络整理
导读:语境: 在我的 Java项目中,我是字节码注入一个类(比如Injected.java),也是字节码,它注入了对Injected.java中方法的引用,这样这个方法就可以设置实例成员的值.这是验证我是字节码注入正确事物的一种方法. 问题: 在运行时,实例变量的值未按预期设置 – 这意味
语境:
在我的 Java项目中,我是字节码注入一个类(比如Injected.java),也是字节码,它注入了对Injected.java中方法的引用,这样这个方法就可以设置实例成员的值.这是验证我是字节码注入正确事物的一种方法.

问题:
在运行时,实例变量的值未按预期设置 – 这意味着我的字节码注入显然不能正常工作.

题:
1)如何在运行时检查JVM中加载的(新注入的已修改)类的内容? (javap帮助现有课程执行此操作)
2)我可以通过Eclipse调试,字节码注入代码吗?有插件吗?

任何建议表示赞赏.

解决方法

你可以使用 javaassist

让我们一步一步走:

>获取要通过字节码注入修改的类文件(例如,Point.class)的内容

BufferedInputStream fin
= new BufferedInputStream(new FileInputStream(“Point.class”));
ClassFile cf = new ClassFile(new DataInputStream(fin));

> ClassFile提供了addField()和addMethod()来添加字段或方法(请注意,构造函数被视为字节码级别的方法).它还提供了addAttribute(),用于向类文件添加属性.

请注意,FieldInfo,MethodInfo和AttributeInfo对象包含指向ConstPool(常量池表)对象的链接. ConstPool对象必须与ClassFile对象以及添加到该ClassFile对象的FieldInfo(或MethodInfo等)对象相同.换句话说,不能在不同的ClassFile对象之间共享FieldInfo(或MethodInfo等)对象.

要从ClassFile对象中删除字段或方法,必须首先获取包含该类的所有字段的java.util.List对象. getFields()和getMethods()返回列表.可以通过调用List对象上的remove()来删除字段或方法.可以以类似的方式删除属性.在FieldInfo或MethodInfo中调用getAttributes()以获取属性列表,并从列表中删除一个.
>现在,检查,如果注射确实有效:

MethodInfo minfo = cf.getMethod(“move”); //我们假设移动没有超载.

CodeAttribute ca = minfo.getCodeAttribute();

MethodInfo / CodeAttribute中有许多方法可供检查

如果您喜欢,请告诉我.那个案子我将在http://puspendu.wordpress.com/刊登更详细的博客

参考:here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读