问题标签 [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.

0 投票
2 回答
1711 浏览

java - 使用 OSGi 时是否可以进行字节码操作?

我正在制作一个应用程序服务器,在其中我需要使用一些字节码操作(例如,将自定义equalshashCode方法插入到带有注释的类中@Entity)。现在我给 JVM 一个 Java 代理(-javaagent选项),它使用ASM进行字节码转换。

我一直在考虑使用OSGi,但我不知道它是否允许我进行必要的字节码操作。

  1. 使用 OSGi 时是否可以进行字节码操作?如何?
  2. 捆绑包是否可以声明自己,它需要一些字节码操作才能工作?例如,应用程序服务器要求对它自己的一些核心类进行操作。
  3. 是否可以指定某个其他捆绑包需要一些字节码操作,而该捆绑包不知道它?例如,所有在服务器上运行的应用程序都必须被操纵,但应用程序不需要知道它。
  4. 捆绑包是否可以声明自己,所有依赖于它的捆绑包都必须进行字节码操作?这将使我很容易声明所有依赖于包含@Entity注释的 API 包的人都必须被操纵。
0 投票
2 回答
6162 浏览

erlang - Erlang 编译器如何处理模式匹配?它输出什么?

我刚刚问了一个关于 Erlang 编译器如何实现模式匹配的问题,我得到了一些很好的回应,其中之一是编译后的字节码(通过传递给c()指令的参数获得):

它只是简单的 Erlang 元组。我期待一些神秘的二进制东西,你猜不是。我在这里一时冲动地问这个问题(我可以查看编译器源代码,但通过额外的洞察力提出问题总是会更好),这个输出是如何在二进制级别翻译的?

比如说{test,is_tuple,{f,3},[{x,0}]}。我假设这是一条指令,称为“测试”......无论如何,所以这个输出本质上是字节码级语言的 AST,二进制编码只是 1-1 翻译?

这一切都太令人兴奋了,我不知道我可以这么容易地看到 Erlang 编译器把事情分解成什么。

0 投票
2 回答
9408 浏览

c++ - 如何在 C++ 中的大端和小端值之间进行转换?

如何在 C++ 中的大端和小端值之间进行转换?我正在使用 VC++ 6.0。当我使用 _byteswap_ulong() 函数时,它需要头文件 intrin.h。当我包含头文件时,它会报告一个错误,指出编译器不兼容,并且 intrin.h 用于 gcc 编译器。那么除了这个函数之外,还有其他函数可以在 VC++ 中的 big-endian 和 little-endian 值之间进行转换吗?

0 投票
1 回答
7015 浏览

java - 什么是 GeneratedMethodAccessor1、2 等,为什么找不到它们?

我得到这样的堆栈跟踪:

什么是 GeneratedMethodAccessor1, GeneratedMethodAccessor2, GeneratedMethodAccessorN,什么可能导致它们找不到?我在运行时进行了一些字节码重写,但仅在加载类之前,并且通过反射的前几次调用工作正常。我想知道在 JIT 编译器获取我的代码之后是否会发生这种情况,但我什至不知道如何开始调试它。

0 投票
5 回答
5995 浏览

java - 在已编译的 Java 类中重写方法调用

我想在解析编译的类文件时用对方法体内的另一个类的调用替换对给定类的调用......
或者换句话说,是否有一种方法可以检测方法中给定类的用法并仅替换该部分使用类似javaassist的方法。

例如..如果我有编译版本

有没有一种方法可以检测 B 的使用,然后更改代码以执行

我知道另一种方法是编写一个解析器来 grep 源文件以供使用,但我更喜欢更优雅的解决方案,例如使用反射来生成新的编译类文件。

有什么想法吗 ?

0 投票
2 回答
3064 浏览

java - 使用 ASM Java 库拆箱

我正在使用 ASM Java 库来替换一些反射。我生成这个方法的主体:

使用这个生成的方法,我可以在运行时在对象上设置字段,而无需使用反射。它工作得很好。但是,我发现原始字段失败了。这是我的 set 方法的相关部分:

此代码正在为选择生成案例标签。它适用于对象,但对于原语我得到这个错误:

期望在堆栈上找到浮点数

好的,这是有道理的,我需要自己拆箱。我实现了以下内容:

我已经追踪过了,它肯定会进入适当字段的“case Type.FLOAT”,但是,我收到了这个错误:

期望在堆栈上找到对象/数组

这就是我卡住的地方。对于我的生活,我无法弄清楚为什么拆箱不起作用。“ALOAD, 3”是将set方法的第三个参数放入堆栈,应该是一个Float。有任何想法吗?

我发现 asm-commons 库有一个具有 unbox 方法的 GeneratorAdapter 类。但是,我真的不想再为应该如此简单的东西包含另一个 JAR。我查看了 GeneratorAdapter 源代码,它正在做一些非常相似的事情。我试图修改我的代码以使用 GeneratorAdapter,只是想看看它是否有效,但根本没有发现它很容易转换。

0 投票
1 回答
3038 浏览

python - 将 Python 字节码重新组装成原始代码?

这可能是一个愚蠢的问题,但是,鉴于输出,说..

..或.pyc文件 - 是否可以将其重新组装成一段有效的 Python 源代码?即在哪里reassemble(dis(myfunc)) == "def reassembled_function(x):\n print x ** 2"

不是出于任何特定的实际原因,我只是好奇这是否可能,或者是否已经尝试过……

有关的

0 投票
4 回答
2075 浏览

java - JAXB 是否使用字节码检测?

我工作的某个人注意到(在堆栈跟踪中)当使用 -javaagent:spring-instrumentation.jar 运行 jvm 时,我的 JAXB 注释类中有一些我们没有编写的奇怪的新方法:例如 SomeJaxbAnnotatedClass$JaxbAccessorM_getFields_setFields_java_util_Set.get

这是否意味着 jaxb 在可用时使用字节码检测?我在哪里可以阅读有关此功能的更多信息?

谢谢,尤瓦尔

0 投票
1 回答
818 浏览

python - 如何从 Python 中的模块生成代码对象?

我有一个没有相应 Python 源代码的 .pyc 文件。我想看看使用 dis 的模块的反汇编。我可以很好地导入我的模块

但是要调用 dis.dis ,我不能使用模块对象。我需要支持 foo 的相应代码对象。我如何创建它?compile 似乎可以编译字符串、类、方法和函数,但不能编译文件或模块。

鉴于我所拥有的,如何生成此代码对象?

0 投票
3 回答
1531 浏览

java - 独立字节码验证器

在我的字节码检测项目中,我经常偶然发现 VerifyErrors。但是,默认的 java Verifier 几乎没有提供有关哪条指令导致错误的信息(它只提供方法和一条小消息)。是否有任何独立的字节码验证器可以提供更高级的帮助来定位错误,至少是精确的指令位置?谢谢你。