问题标签 [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-bytecode-asm - 在 java 运行时添加额外的代码
我正在开发一个库,我需要在运行时向我的对象的一些方法添加额外的代码。这里有两点。首先,我想添加额外代码的程序是之前由其他人编写的,我不想编辑它。其次,我的工作非常类似于在调用方法之前添加方面。
在互联网上搜索和阅读后,我发现了许多框架,如 aspectj、ASPECTWERKZ 等,可以完成这项工作,但例如 aspectj(在 spring 上下文中使用时)的问题是它没有为您提供任何 API在运行时进行编织。我还发现有一些库,如 ASM 和 javassist 等,但它们非常通用且难以学习,而我的工作更可能是方面。
所以你有什么建议?那里有什么好的图书馆吗?我对前面提到的上述库有误吗?请帮忙!
java - 如何使用 ASM 添加带有初始值设定项的静态最终字段?
我想使用 ASM 将静态最终字段添加到 .class 文件中,源文件是
反编译生成的类应该是这样的:
作为结论,我想使用 ASM 将 FIRST 和 SECOND 常量添加到 .class 文件中,我该怎么做?
java - 如何使用 ASM 将操作码从一个方法复制到 Java 类文件中的另一个方法?
这是一些代码。
这两种方法执行相同的操作。第一种方法的第二个参数是psudo-argument,所以我想把原代码清空,把这个方法做成这样……
我该怎么做这个动作?我试过这样。
但抛出空指针异常。是什么原因?
java - 方法中的局部变量类型错误
我正在使用 ASM 4 动态生成一些类。一切都很顺利,直到我开始生成代码来进行异常处理。生成的字节码在底部。这是我得到的错误:
这是字节码:
我使用 ASMifier 开始:
但后来我不得不修改它以使其通用。这是生成 try/catch 部分的代码:
java - Java字节码交换双值和长值?
我正在使用 ASM 开发 Java 检测引擎,并且存在评估堆栈顶部具有特定值的情况,我想在现有value之前插入一个ref(这是getstatic的结果) 。即考虑只有一个值的堆栈: ,然后在getstatic我希望堆栈变成这样: 。value ->
ref, value ->
要执行此行为,我必须插入以下字节码:getsatic和swap。使用 ASM,我会做类似的事情(考虑mv
类型MethodVisitor
):
问题是交换字节码不支持long
和double
值。所以上面的代码对于单字类型是可以的,但是对于long
和double
类型就不行了。
是否有任何简单的解决方案来解决long
和double
类型的这个问题并且不需要辅助本地值?
bytecode - 使用 ASM 的类验证器 (org.objectweb.asm.util.CheckClassAdapter) 进行类验证期间出现 ClassNotFound 错误
因此,这是我尝试使用 ASM 的类验证器验证的字节码片段:
这是一个更大的类 org/apache/xerces/impl/io/UTF8Reader 的一部分。现在,当我通过 ASM 提供的 Class verifier 运行这个类的字节码时,我得到以下结果:
我对最后一点感到非常困惑......为什么它在第 7 行为 org/apache/xerces/util/MessageFormatter 对象发出 ClassNotFound 异常?
谢谢。
java - Java找出.class有什么导入
有没有办法找出一个类有什么进口?
在这个问题中: Jon Skeet 说你不能使用反射来做到这一点,但是
如果您想查找编译后的代码中使用的所有类型,那就是另一回事了。您可能希望将 BCEL 视为一种分析字节码的方法。
这就是我想知道该怎么做。
java - 如何在使用 asm 库进行检测的方法中找到一个空的局部变量
在为其不同方法检测类时,为了使方法在文本文件中执行写入操作。我首先将字符串存储在显式定义的局部变量 3160 中。如何选择这些变量以防止与已经存在的变量发生冲突。
就像在这个片段中的代码每次进入任何方法时都会将类名写入文本文件的工作。为此,必须使用变量 3160 将字符串 s 加载到堆栈上(值保持较大,以便已定义的变量名称与变量 s (3160)不冲突。我的问题是如何在方法中定义局部变量在使用 ASM 库进行检测期间。这个问题对许多人来说似乎还为时过早,但那是因为我是初学者。
java - Java ASM 字节码修改-改变方法体
我在一个 jar 中有一个类的方法,我想用我自己的来交换它的主体。在这种情况下,我只想让方法将“GOT IT”打印到控制台并返回 true;
我正在使用系统加载器来加载 jar 的类。我正在使用反射使系统类加载器能够通过字节码加载类。这部分似乎工作正常。
我正在关注此处的方法替换示例:asm.ow2.org/current/asm-transformations.pdf。
我的代码如下:
问题似乎mv.visitMethodInsn(access, cname, newName, desc);
在generateMethodBody
里面MethodReplacer
。
我收到“常量池中的非法类型”错误。
我不确定我错过了什么……但是在阅读和测试了大约 3 天之后,我仍然没有得到任何结果。
[编辑]
如果您想知道,tmcore
这是一个律师的单人“异议”游戏。我这样做是为了好玩。该程序成功启动了游戏,一切都很好,删除修改MethodReplacer
使游戏按设计运行。所以这个问题似乎与我在方法替换器中的错误字节码/修改有关。
[编辑2]
CheckClassAdapter.verify(cr, true, pw);
返回函数在编辑之前应该具有的完全相同的字节码。就好像没有进行更改一样。
[编辑3]
classtoload
根据评论注释掉的副本
java - 无法从空堆栈中弹出操作数
使用 ASM 4。我正在从另一种语言动态生成字节码。它正在生成以下内容,但我不清楚发生了什么。我的猜测是 try/catch 块正在干扰堆栈。前两行正在加载一个 Lambda2,然后它需要在最后成为堆栈中最深的项目,但我不明白是什么让它一路消失。
似乎在指令 13 处堆栈消失了。这就是它进入 try/catch 块的地方。堆栈进入 try/catch 块时是否会被丢弃?如果是这样,那将解释问题。