问题标签 [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 字节码检测
我创建了一个 JVMTI 代理,它在高级别执行以下操作:
onClassLoadHook 将加载类的字节码发送到一个单独的 Java 进程,该进程将使用 ASM 检测类
取回字节码并加载它们
在我对加载的 Java 类进行检测的单独 Java 进程中,我执行以下操作:
......
当我尝试使用 Java Decompiler 反编译在此检测之后编写的类时 - 我看到以下我知道是错误的反编译函数:
因为我的函数实际上是这样的:
谁能告诉我我在这里做错了什么?我唯一的线索是,如果不是将 THIS 指针作为参数传递给我的函数,而是传入原始类型,那么一切都会顺利进行。我需要管理的 THIS 指针有什么特别之处吗?我已经比较了字节码,并使用了 ASMIFIER 来了解我需要使用哪些语句来生成正确的字节码。
java - 字节码检测生成 java 验证程序错误
我正在使用 ASM 来为 Java 程序进行字节码检测。我所做的很简单 - 在检测方法时,如果指令是 PUTFIELD,只需在指令之前执行 DUP_X1,然后访问 PUTFIELD 并使用包含 DUP 的堆栈条目的参数注入函数调用。
代码在检测之前和之后分别如下所示:
但是当我运行检测代码时,我得到:
java.lang.VerifyError:期望在堆栈上找到对象/数组
你能提供任何帮助吗?
java - 使用 ASM Java 库拆箱
我正在使用 ASM Java 库来替换一些反射。我生成这个方法的主体:
使用这个生成的方法,我可以在运行时在对象上设置字段,而无需使用反射。它工作得很好。但是,我发现原始字段失败了。这是我的 set 方法的相关部分:
此代码正在为选择生成案例标签。它适用于对象,但对于原语我得到这个错误:
期望在堆栈上找到浮点数
好的,这是有道理的,我需要自己拆箱。我实现了以下内容:
我已经追踪过了,它肯定会进入适当字段的“case Type.FLOAT”,但是,我收到了这个错误:
期望在堆栈上找到对象/数组
这就是我卡住的地方。对于我的生活,我无法弄清楚为什么拆箱不起作用。“ALOAD, 3”是将set方法的第三个参数放入堆栈,应该是一个Float。有任何想法吗?
我发现 asm-commons 库有一个具有 unbox 方法的 GeneratorAdapter 类。但是,我真的不想再为应该如此简单的东西包含另一个 JAR。我查看了 GeneratorAdapter 源代码,它正在做一些非常相似的事情。我试图修改我的代码以使用 GeneratorAdapter,只是想看看它是否有效,但根本没有发现它很容易转换。
java - ASM jar - 为什么我的 java 项目依赖于此?
我有一个 Java 项目,在内部它依赖于asm jar
. 奇怪的是,我什至不知道为什么我的项目以某种方式依赖于这个库(可能是由 maven 作为传递依赖引入的)?
谁能帮我知道为什么有人需要 asm jar?
提前致谢 !
编辑: 您能否还提到一个可能需要 asm jar 的目的/用例?
java - Java、ASM org.objectweb.asm.util.CheckClassAdapter 导致 Unsupported major.minor 版本 0.0
我收到以下异常:
尝试使用以下源代码检测某些字节码时。(准确地说,当我尝试执行修改后的字节码时出现此异常)
我认为这可能是我的 InstrumentClassAdapterInstrumenter 实现,所以我把它省略了,我现在只使用 CheckClassAdapter。谁能看到我做错了什么?
干杯,
java - 如何使用 ASM 访问者检查堆栈?
我正在尝试使用 Java 字节码工程库ASM来执行静态分析。我有一种情况,我想检查分配给字段的变量。
我有MethodVisitor
哪个实现该visitFieldInsn()
方法。我正在专门寻找putfield
命令。那没问题。问题是,当我遇到 时putfield
,我希望能够访问将分配给该字段的变量。具体来说,我想访问有关变量类型的信息。
目前我真的只需要查看堆栈顶部的内容,但如果有更通用的方法来检查它,那就更好了。
有没有办法使用 ASM 来检查堆栈上的变量?
java - 是否可以让 System ClassLoader 在运行时加载指定的 .class 文件?
我正在为作业编写一个静态分析工具,它使用 ASM 库分析 Java 字节码。我们使用的 ASM 的其中一个部分要求(或至少似乎要求)从 ClassLoader 加载类。
我们希望该工具能够分析 .class 文件,而无需将它们放在类路径中。我们已经在运行时从指定目录加载 .classes 并使用 InputStream 读取它们。在大多数情况下,这对于 ASM 来说是可以接受的。有一些类,例如SimpleVerifier
,尝试加载这些类。
在这种情况下,是否可以注册要加载的 .class 文件,以便调用Class.forName()
将加载它们?或者有没有一种简单的方法来扩展 ClassLoader 以允许这样做?
编辑:关于的信息URLClassLoader
很有用。不幸的是,Thread.currentThread().setContextClassLoader()
在这种情况下使用该实例不起作用。我调用的库代码使用它在实例初始化时使用getClass().getClassLoader()
.
当我设置 URLClassLoader 时,该类尚未初始化,所以我猜 contextClassLoader 没有加载该类。
我是否正确理解了这些回答?是否有可能使用 URLClassLoader 加载第 3 方类?
java - 即使设置了 ClassWriter(COMPUTE_MAX + COMPUTE_STACK),ASM(来自 ObjectWeb)也无法正确计算 MaxStack
尝试加载使用 ASM 生成的类时,我收到了预期的 ClassVerifyErrors。在进一步检查中,我可以看到 jvm 是正确的,并且正在讨论的方法具有无效的 MAX_STACK 值。奇怪的是我正在使用自动计算堆栈和最大本地选项,所以这应该不是问题......带有无效选项的方法非常简单,但结果是错误的字节码。
我已经用预期的方法编写了一个类,并将我的 asm 生成的类与 javac 生成的类进行了比较,字节码匹配唯一的错误是最大堆栈为 0,这是错误的,而 javac 设置的值为 2。
我想避免自己计算 tha max stack/locals。
java - 错误:java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter。(一)五
我正在开发一个小型 Spring 应用程序。我必须将学生信息的详细信息存储在数据库中。我开发了一个 SimpleFormController。我使用过 NetBeans + Hibernate 映射 + Spring。当我部署项目时,出现以下错误。
我的 spring-config-db-applicationContext.xml 如下所示:
出现以下错误:
java - 更改 Java JAR 的根包
我正在编写一个 Java 代理,它使用 Java ASM 库来处理字节码。这是一个通用库,我想确定我的代码在运行时使用的 ASM 版本。
获取 ASM 类并将它们处理为私有副本的最简单和最自动化的方法是什么,其中所有类都已重新定位到新的根包中。
具体来说,我想把 ASM 罐子org.objectweb.asm.*
变成org.myproject.internal.org.objectweb.asm.*
请记住,我最感兴趣的是自动化解决方案。我知道我可以获取 ASM 的源代码并手动或使用脚本执行此操作,然后重新编译 jar,但这感觉像是很多开销。