问题标签 [java-bytecode-asm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ASM 方法访问器可以与接口一起使用吗?
我需要编写一个工具,列出调用指定接口方法的类。它将用作由许多模块组成的大型 Java 应用程序的构建过程的一部分。目标是自动记录某些 java 模块之间的依赖关系。
我发现了几个用于依赖分析的工具,但它们不适用于方法级别,仅适用于包或 jar。最后我找到了ASM,这似乎可以满足我的需要。
以下代码打印给定目录中所有类文件的方法依赖项:
问题:
该代码仅适用于常规课程!如果类文件包含接口,则调用visitMethod,但不调用 visitMethodInsn。我没有得到有关接口方法调用者的任何信息。
有任何想法吗?
java - 使用 ASM 或 Javassist 提高字段获取和设置性能
我想避免在我正在开发的开源项目中进行反思。在这里,我有如下课程。
我扫描@Property
注释以确定我可以从 PurchaseOrder 反射性地设置和获取什么。有很多这样的类都使用java.lang.reflect.Field.get()
and java.lang.reflect.Field.set()
。
理想情况下,我想为每个属性生成一个调用程序,如下所示。
现在,当我扫描类时,我可以创建一个类似的静态内部类PurchaseOrder
。
有了这些,我完全避免了反思的成本。我现在可以使用本机性能从我的实例中设置和获取。谁能告诉我我会怎么做。一个代码示例会很棒。我在网上搜索了一个很好的例子,但找不到这样的例子。ASM 和 Javasist 的例子也很差。
这里的关键是我有一个可以传递的接口。所以我可以有各种实现,可能一种默认使用 Java Reflection,一种使用 ASM,另一种使用 Javassist?
任何帮助将不胜感激。
java - 使用 Asm 字节码生成器 (ClassWriter) 生成具有泛型类型的方法
使用 Asm 定义简单的 getter 和 setter 很容易(幸运的是,它甚至在他们的 FAQ 中有解释)。但是没有提到的一件事,我一直找不到文档,就是如何使用泛型类型信息来实现这些。
我实际上能够很容易地确定泛型类型信息本身(因为代码将采用现有的字段和/或方法,并且存在完整的泛型类型处理和解析)。我只需要为包含泛型类型的类型生成泛型版本。
我希望这与修改签名 Asm ClassWriter/MethodVisitor 调用一样简单,但文档中的一些评论表明它可能并不那么容易(因为泛型信息存储在与常规信息不同的位置)。
编辑:看起来入口点是“ClassWriter.visitField/Method(...., String signature) - 请注意,它是包含普通非泛型类信息的“描述”,但术语“签名”(在 JLS 中)专门指到泛型——包括类型信息。
java - 如何检查字节码操作 PUTFIELD 是否正在使用 ObjectWeb ASM 重新分配属于“this”对象的字段?
我正在使用ASM字节码操作框架对 Java 代码执行静态分析。我希望检测何时重新分配对象的字段,即何时发生这种代码:
使用以下代码(在实现的类中ClassVisitor
)可以检测到上述情况:
但是,无论拥有该字段的对象如何,都会调用此代码。我想找到在this
对象上执行 PUTFIELD 操作的更具体的情况。例如,我想区分第一个代码片段和如下代码:
在上述情况下,仍然执行 PUTFIELD 操作,但这里它是针对局部变量 ( newObject
) 而不是this
对象。这将取决于分配时堆栈的状态,但我遇到了一些字节码完全不同的不同场景,我正在寻找处理这种复杂性的方法。
如何检查 PUTFIELD 是否正在重新分配属于this
对象的字段?
编辑
我使用 ASM 仅执行分析,而不是检测现有字节码。如果可能的话,最好我想找到一种在不改变字节码的情况下发现这一点的方法。
java - 通过 ASM Java Bytecode 访问外部类的私有字段时获取 java.lang.IllegalAccessError
在反射中,可以通过 getDeclaredField() 和 setAccessible(true) 访问私有字段。如何通过 Objectweb ASM 字节码 API 访问外部类的私有字段?我设置通过类似的方式获取私有字段
当执行字节码并获取私有字段时,我总是收到错误“java.lang.IllegalAccessError”
有什么线索吗?感谢捆绑,
java - 仪器仪表
我是 ASM(字节码操作工具包)的新手,正在使用它来检测 java 字节码。我想访问一个类的方法并使用 ASM 更改它们的访问修饰符。有人知道如何实现这一目标吗?我知道调用 visitMethod 会有所帮助,但不知道如何准确地做到这一点任何关于此的信息都会有所帮助。谢谢你。
java - 使用 ASMifierClassVisitor 时出错
我想使用 ASMifierClassVisitor 工具来获取创建类的 asm 代码,但是当我使用它时出现错误
我使用了代码
这里有什么问题?
java - Java:在运行时从同一 JVM 中获取类的字节码
我正在为 Clojure 添加持久性,我终于可以准备添加功能了。在 Clojure 中,函数被字节编译成带有调用方法(以及其他方法)的类。这样,功能是一流的。为了使这些持久化,我需要对这些类进行序列化和反序列化。如何在无法访问 .class 文件的情况下获取类的字节码?
如果我弄错了,请纠正我,但使用代理需要生成一个单独的虚拟机,代理连接到第一个虚拟机。我需要从同一个虚拟机上做这件事。
使用 Serializable 来设置和获取 Class 对象是不够的。在反序列化时,我需要加载类,并且在后续的 VM 实例中,可能存在类名冲突。我需要修改字节码以将类重命名为在反序列化/类加载时唯一的名称。
java - asm 中的静态初始化器
我想初始化一个使用 asm 添加到类中的静态字段。如果我可以访问静态初始化程序,那么我可以进行初始化。
如何初始化静态字段?
java - 字节码操作以拦截设置字段的值
使用类似ASM
or的库cglib
,有没有办法在设置类字段的值时向类添加字节码指令以执行代码?
例如,假设我有这个类:
假设一段代码包含这一行:
person.name = "Joe";
我希望截获这条指令,以便将dirty
标志设置为true
. 我知道这对于 setter 方法是可能的person.setName (“Joe”)
——因为类方法可以通过字节码操作来修改,但我想对字段做同样的事情。
这可能吗,如果可以,怎么做?
编辑
我想避免修改访问类的代码部分,我正在寻找一种方法将拦截代码保留为Person
类的一部分。是否有用于字段访问的伪方法,类似于 Python 类中的属性?