问题标签 [bytecode-manipulation]
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 - 字节码操作能否在运行时更改 Java 方法的返回类型?
我想知道是否可以通过字节码操作来做这样的事情:
现在我想打电话:
并调用 String 参数的重载 hi 方法。
java - 如何表示Java Double Array 类型(修复反汇编代码)
我有一些代码依赖于使用 Java 1.7 编译的 jar。我目前在 OSX 上工作,我只能访问 Java 1.6。我目前正在尝试在本地重新编译这些 jar。但是,jar 只包含 .class 文件。我下载了一个反汇编程序并保存了生成的 .java 文件。现在,我目前正在尝试调试一些错误。其中一个文件检查某些参数是否等于类或类型。我遇到的问题是有表达
这导致编译器错误。表达双数组类的正确方法是什么?
java - 如何从java中的字节偏移量获取源代码的行号?
我正在操作一个 .class 文件。我正在使用InstrutionHandle包来一次获取一个说明。我通过getPosition()方法获得了指令的字节偏移量,我可以从字节偏移量中获取源行号吗?
java - Java 中的程序代码修改(例如变量提取)
我知道使用反射可以做一些很好的事情,例如调用方法或更改字段的值。但是,是否可以在运行时和以编程方式进行更重的代码修改?
例如,如果我有一个方法:
我可以写一个程序来修改这个方法的内部结构,注意到它为一个字段分配了一个常量,然后把它变成下面这样:
也许 Java 并不是真正可以做这种事情的语言——如果不是,我愿意接受一些语言的建议,这些语言可以让我基本上以这种方式重新解析或检查代码,并能够如此精确地改变它。不过,我可能在这里做白日梦,所以请告诉我是否也是这种情况。
java - ASM 中的 Java 方法参数值
我正在尝试获取 Java 程序方法参数的值。我正在使用 ASM 来检测字节码并获取这些值。但是,我遇到了一些麻烦。
这是用于检测代码的 visitCode() 方法。它正在做的是:
- 创建一个空数组来存储收集到的参数。
- 对于每个参数,将其值加载到数组中。
- 将此数组发送到我的代理的 OnMethodEntry 方法(将在其中使用值)。
.
但是,当该方法显然具有多个参数时,这不起作用。
获得的类文件显示如下:
其中创建了 2 个本地对象而不是加载参数。
字节码没有显示任何奇怪的东西:
最后,显示的错误是(使用 -noverify 时):
否则,它是:
通常,这应该更有效,因为我只是从堆栈帧中加载信息。我还尝试检查静态和非静态方法(截至此处解释的堆栈:http ://www.artima.com/insidejvm/ed2/jvm8.html ),但仍然没有成功。
关于为什么会发生这种情况的任何想法,或者可能是解决方案的想法?
谢谢 :)
编辑:
它现在可以在打包原始类型时工作(感谢下面 int3 的建议 :))。这是 visitCode() 方法的工作代码:
java - 注入一个Java方法_before_另一个方法被调用
我正在使用 ASM 并想重写如下内容:
至:
问题是我不知道之前的方法是什么,我只知道目标方法(因此someMethod()
在此之后查找和注入不是一种选择)。
我也有许多版本的目标方法,我希望它使用不同的参数集。
使用 ASM 我可以很容易地找到目标方法调用,但不幸的是,此时的操作数堆栈是:
虽然我可以计算出实例将下降多远,但我无法注入可以读取它的字节码。我知道你最多可以使用 dup 命令的技巧来处理 4 个参数,但我需要一个通用的解决方案。
我可以添加一堆局部变量并从堆栈中复制所有内容,复制指向的实例并将所有内容放回原处,但这是我真的不想要的运行时效率低下。
我认为可行的是,如果我可以跟踪哪些指令负责将实例指针放在堆栈上,然后我可以将我的方法调用注入那里而不是目标方法调用。但是,我没有运气找到任何可以帮助我做到这一点的东西。
我知道像 AspectJ 这样的东西允许这样做,但是在加载很多类时必须这样做,而且 AspectJ 太慢了。
谁能指出基于 ASM 构建的分析工具可能让我这样做,或者任何人都可以想到一种更好的方法来在另一个方法调用之前注入一个方法调用?
java - 重命名预编译类文件的导入 (Java)
问题是什么? 我是一名 Minecraft 服务器管理员/服务器主机/插件开发人员,但发现在核心游戏的每个新版本上都必须更新我自己的个人插件是一件绝对的烦恼。并非总是这样,过去我已经让插件跨 20 个版本工作而没有中断。可以想象,每个月必须坐下来更新 40 个插件是我生活中不必要的烦恼,因为我过去从未这样做过。
是什么导致了这个问题? 在每个新版本中,它们都要求您在编译的 jar 文件中使用不同的导入,从而强制破坏任何过时(但可能仍在工作)的 jar 文件。相信我。我可以阅读错误日志并知道何时需要实际下载新更新。我现在不需要保护自己。这只是一个游戏,我没有太多的兴趣。
那么我想怎么做呢? 为此,我想制作一个简单的程序来自动更新我所有的插件。(插件以打包的 .jar 文件的形式出现。)它需要执行以下操作:
- 获取 X_Folder 中所有 jar 文件的列表
- 对于每个 jar 文件,将所有类都封装起来。
- 对于每个类文件,搜索 Y_STRING 的任何实例并将其替换为 Z_STRING。
- 确保所有内容都正确放回 jar 文件中。
- 完毕。
问题? 我将如何编写类文件编辑方法?我什至不知道如何开始。
免责声明 很抱歉听起来我还没有开始研究这个。我只是,没有任何字节码操作的经验。我看过一些例子,但还没有看到任何关于重命名导入的内容。希望这里有人可以帮助我。谢谢!
java - 与 ASM 字节码检测功能不兼容的参数
我在使用 Guava 库运行一个简单的主程序时遇到了一些麻烦。
我已经使用我的代码从这里对类进行了检测以获取方法参数:ASM 中的 Java 方法参数值
问题是,虽然代码适用于小型项目(又名河内塔),但使用 Guava 我有错误和异常。
特别是在测试 Joiner.join 方法时,我有这个错误:
在使用 -noverify 运行示例时,我有一个例外:
方法的字节码是一致的:
我知道该错误可能与库版本有关,但主要的 java 程序是针对已检测的库编译的,并使用该库的同一个 jar 运行。
关于为什么会发生这种情况的任何想法?以及如何解决?
谢谢 :)
编辑
下面是方法 withKeyValueSeparator 检测前后的字节码
原始字节码:
检测字节码:
以下是 joiner 类的完整字节码:
原文: http: //pastebin.com/VsccVX18
检测:http : //pastebin.com/xtke1a8y
java - ASM 字节码库中用于确定操作码性质的实用方法?
ASM 中是否有任何 utils 类允许我从操作码推断指令是某种存储、加载还是其他?
例如,考虑以下代码(来自 ASM)
使用 Utils.isConst(opcode) 或 Utils.isLoad(opcode) 或 Utils.isStore(opcode) 等方法会很方便。
ASM中有类似的东西吗?