问题标签 [jvm-bytecode]
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 - 使用 groovy 对象而不是使用 java 反射是个好选择吗
在java反射中,我们一般会尝试在运行时通过属性名来获取字段值。但考虑到性能影响,不建议使用反射。
但是在这种情况下,我们可以使用 groovy 对象,它允许通过属性名称检索值
例如:
Person.groovy
主应用程序.java
这将具有与反射相同的性能吗?
java - ASM 参数编号
假设我有一个虚拟班级
asmifier 将为该run
方法创建以下内容:
我不明白这一点:
在我看来,只有三个参数run
:
那么为什么现在使用而不是f
加载呢?3
2
java - 在某些接口上限制 lambda
假设我有几个接口只有一个抽象方法。有了这些接口,我可以用它声明 lambda:
简短的问题:是否有一些技巧或技巧来限制使用A
lambdas 接口并在尝试这样做时使构建失败?任何暗示,无论是否肮脏,都是受欢迎的(“肮脏”是指编译/字节码级别的黑客攻击 - 不会影响源代码,最好是公共合同)。
长话短说:对于某些接口实现者,我考虑将其定义equals/hashCode
为合同的一部分。此外,我equals/hashCode
在构建时自动为它们生成。
在这种情况下,lambda 是麻烦制造者。对于接口的普通和匿名实现者,A
我可以.class
在构建时找到一个文件并检测其字节码。对于 lambda,有一个 VM 匿名类,在运行时生成。在构建时影响这样的类似乎是不可能的,所以我至少需要为一组特定的接口禁止这样的场合。
java - 为什么 Java 1.0.2 的接口 Member 没有设置 ACC_ABSTRACT?
我编写了一个简单的 Java 字节码解析器来做一些实验,最近它在一个意想不到的地方失败了。java/lang/reflect/Member.java
从 Java 1.1.8.16读取时rt.jar
,我的解析器发疯了,因为Member
开始时是这样的(注意缺少的ACC_ABSTRACT
标志):
Java 1.2.2.17 的版本更正了这一点,并将标志设置为0x0601
( ACC_ABSTRACT | ACC_INTERFACE | ACC_PUBLIC
)。
我能找到的最早的 JVM 规范(据称是 1.0.2)有这样的说法(§4.1,第 86 页,强调添加):
接口是隐式抽象的(§2.13.1);它
ACC_ABSTRACT
的标志必须被设置。接口不能是最终的;如果是这样,它的实现将永远无法完成(第 2.13.1 节),因此它不能ACC_FINAL
设置其标志。
JVM 规范的第 9 版有类似的话要说:
如果设置了标志
ACC_INTERFACE
,则ACC_ABSTRACT
标志也必须设置,并且不能设置ACC_FINAL
、ACC_SUPER
、ACC_ENUM
和ACC_MODULE
标志集。
Oracle/Sun JVM 是否强制执行“必须”这样的要求?如果有,从什么时候开始?如果不是,为什么 JVM 规范还要假装它是必需的?
java - IntelliJIDEA for Scala 中的 Java 字节码反编译器
我正在使用 IntellijIDEA 终极版。浏览.class
从java
源代码编译的文件很容易:我只需双击.class
文件,IDEA 就会对其进行反编译。
但是,对于.class
从scala
源代码编译的文件,它不起作用。似乎IDEA只是引用了scala
源文件。
我注意到 IDEA 的行为只有在scala plugin
安装时才会这样。没有它它工作正常。有没有办法在不关闭的情况下使用 IDEA 进行反编译scala plugin
?
java - 为什么在 CgLib BeanCopier 中有一个无用的(在我看来)dup2
cglib 的 BeanCopier 使用方法 net.sf.cglib.beans.BeanCopier.Generator#generateClass 根据你给出的 clazz 得到一个特定的 BeanCopier。但是在 BeanCopier.java 的第 152 行,我认为那里有一个无用的 dup2。我自己制作的 BeanCopier 只是删除了第 152 行,其余部分与 CGLIB BeanCopier.java 相同,我的复印机仍在工作,没有任何异常或错误。有 Cglib BeanCopier.java 生成的字节码
Mine Copier 只是没有 dup2 并且仍在工作。
所以,我的问题是:dup2真的没用,还是我错过了dup2有用的一些情况?</p>
PS:我不熟悉java字节码,所以如果我问一些愚蠢的问题,我很抱歉。
java - 将 Java 指令集(字节码)编译为二进制 .class 文件
我面临一个问题,我认为我没有使用正确的术语来寻找解决方案。
所以,我有文本(字符串)形式的字节码,如下所示:
现在我需要将它编译成一个 .class 文件。
我查看了 ASM、Jasmin 和其他汇编工具,但找不到合适的解决方案。我从这些工具中了解到的是,您使用特定的指令集语言编写程序并将其转换为二进制文件。但我正在寻找的是使用 JVM 自己的常规指令集。
我很感激任何帮助。
java - ASM - 分支目标处的堆栈图帧不一致
我正在尝试做一个简单的 Java 字节码混淆器,它通过用GOTO
简单的条件跳转替换指令来工作,比如if 10 != 15 GOTO else throw IllegalStateException
. 我目前的代码是:
method
type 的混淆方法的参数在哪里MethodNode
,并且该类实现了 interface Opcodes
。
这很好用,但不适用于所有方法(我对字节码很陌生,所以不知道具体情况)。例如,它适用于以下main
方法:
原始 Java 代码(在 Procyon 中反编译): https ://p.reflex.rip/DLMT.cs
原始字节码: https ://p.reflex.rip/ywJt.go
混淆的 Java 代码(在 Procyon 中反编译): https ://p.reflex.rip/Er9V.cs
混淆字节码: https ://p.reflex.rip/JBAb.go
但是,它破坏了其他divMinByMax
方法之一:
原始 Java 代码(在 Procyon 中反编译): https ://p.reflex.rip/AW9W.java
原始字节码: https ://p.reflex.rip/GX2k.cpp
混淆的 Java 代码(在 Procyon 中反编译,失败): https ://p.reflex.rip/Eqju.java
混淆字节码: https ://p.reflex.rip/isiX.cpp
当我尝试使用以下命令运行混淆的 JAR 时,此方法会导致VerifyErrorjava -jar
:
我做了很多研究,唯一找到的就是原因:据我所知,问题在于堆栈打开@21
(GOTO
跳转到标签执行throw new IllegalStateException
):
stack: { }
@27
(为空)与跳转目标标签上的 ,处的堆栈不匹配:
stack: { 'java/lang/IllegalStateException' }
(其中包含它应该“抛出”的异常)。
所以基本上,据我所知,错误发生在我尝试执行GOTO <n>
跳转时,<n>
其中“抛出”一个IllegalStateException
.
我该如何解决这个问题?也许有一种方法可以在跳转之前使堆栈@21
包含java/lang/IllegalStateException
在跳转之前(以便这两个堆栈,一个在跳转之前和一个在跳转之后,匹配)?或者我可以用它做些什么?
java - 如何检查java方法的字节码长度
目前,我参与了具有许多大型类和生成代码的大型遗留项目。我希望找到所有字节码长度大于 8000 字节的方法(因为 OOTB java 不会优化它)。
我找到了这样的手动方式:多少字节的字节码在Java中有特定的方法? ,但是我的目标是自动扫描许多文件。
我尝试使用 jboss-javassist,但 AFAIK 获取字节码长度仅在类级别可用。
jvm - 使用 Java Assist 检测 Java 代码时出现CannotCompileException,找不到类
我正在尝试创建一个通用 Java 代理来检测任何 Java 应用程序的方法。我已经按照本教程https://javapapers.com/core-java/java-instrumentation/创建了一个 java 代理。java 代理应该寻找一个特定的类(我现在将它限制为一个类,因为它对我不起作用)一旦找到该类,我将使用 JavaAssist API 在每个类的开头添加一个局部变量方法并捕获当前时间。在方法的最后,我想简单地打印方法执行所花费的时间。(几乎遵循所有关于 Java 代理的典型示例。
我使用指向我创建的 Java 代理 jar 文件的 --javaagent 标志运行我的测试应用程序(使用 Vert.x 的 Web 服务器)(代码在下面)。
这适用于没有返回值和没有参数或返回/采用原始类型的方法。
但是,当一个方法返回或获取一个来自另一个类的对象(我认为尚未加载)的参数时,我会收到一个 CannotCompileException 异常,并显示该类在参数列表或返回语句中没有找到。例如,此方法的仪器有效:
但是对于返回 io.vertx.ext.web.Router 的这个方法:
我得到一个异常,我的 java 代理的输出是:
这是我的 java 代理的代码: