gpt4 book ai didi

java - 如何调试在类加载时注入(inject) VM 的字节码?

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:52 26 4
gpt4 key购买 nike

上下文:在我的 Java 项目中,我通过字节码注入(inject)一个类(比如 Injected.java),并且通过字节码注入(inject)对 Injected.java 中方法的引用,这样该方法就可以设置实例成员的值。这是验证我的字节码注入(inject)正确内容的一种方法。

问题:在运行时,实例变量的值未按预期设置 - 这意味着我的字节码注入(inject)显然效果不佳。

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

如有任何建议,我们将不胜感激。

最佳答案

您可以使用 javaassist

让我们一步步来:

  1. 获取要通过字节码注入(inject)修改的类文件(例如,Point.class)的内容
    BufferedInputStream 鳍
    = new BufferedInputStream(new FileInputStream("Point.class"));
    ClassFile cf = new ClassFile(new DataInputStream(fin));

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

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

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

  3. 现在,检查注入(inject)是否真的有效:


    MethodInfo minfo = cf.getMethod("移动");//我们假设移动没有重载。


    CodeAttribute ca = minfo.getCodeAttribute();

    MethodInfo/CodeAttribute中有很多方法可以检查

如果你喜欢,请告诉我。那样的话我会在 http://puspendu.wordpress.com/ 放一个更详细的博客。

引用:here

关于java - 如何调试在类加载时注入(inject) VM 的字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com