jvm-bytecode相关内容

有没有一种聪明的方法来确定 Java 字节码指令的长度?

我正在为 Java 创建一个静态分析工具,如果我可以从 .class 文件中的字节码中获取我正在分析的程序的一些信息,这些信息将更容易获得. 我不关心类文件中可能存在的每一个说明.例如,我可能只需要查看是否有任何 getfield 指令. 问题在于,由于每条指令的长度都是可变的,因此在一般情况下,我需要(在我的代码中)指定每个操作码的长度,然后才能确定(例如)getfield 指令开始 ..
发布时间:2022-01-16 12:30:36 Java开发

JVM中操作数栈的作用是什么?

JVM 运行时数据区为每个正在执行的方法单独的堆栈.它包含操作数堆栈和局部变量.每次加载变量时,都需要const到操作数栈,然后store到局部变量.为什么不直接操作局部变量表,做一些看似重复的工作? 解决方案 具有直接操作数的指令集必须对每条指令中的操作数进行编码.相反,使用操作数堆栈的指令集,操作数是隐式的. 在查看诸如将常量加载到变量之类的小琐碎操作时,隐式参数的优势并不明显. ..
发布时间:2022-01-16 12:17:03 Java开发

Kotlin Bytecode - 如何在 IntelliJ IDEA 中进行分析?

我想查看编译后的字节码,以便我可以详细了解它的工作原理.我正在使用 IntelliJ IDEA 15,但找不到查看字节码的方法.我错过了什么? 解决方案 IntelliJ IDEA 自带 Kotlin 的字节码查看工具: 工具 → Kotlin → 显示 Kotlin 字节码 也可以通过 Ctrl/⌘+Shift+A 作为 Show Kotlin Bytecode 操作使用. ..
发布时间:2021-11-21 17:49:57 Android

如何使用ByteBuddy创建动态代理

在Java中,可以使用 InvocationHandler 的实现来创建动态代理.尽管JVM进行了优化,但使用反射总是会产生调用方法的一些开销. 为尝试解决此问题,我尝试使用ByteBuddy在运行时创建代理类,但是文档在这方面似乎不够清楚. 如何创建 MethodCallProxy 以便将方法调用转发到某些类实例? 编辑: 为了更好地阐明我的问题,我提供了一个我要实现的示 ..
发布时间:2021-05-18 20:35:24 Java开发

jvm会在每次执行时评估明显的返回值吗?

我敢肯定,几乎每个人都对这样.复制粘贴代码段以确保完整性: k = (j = (i = 0) + 2) + 1; return i|= j|= k|= (j+= i) - - (k+++k) - - (i =+j); 以上代码段始终返回11,无论如何.所以我的问题是:jvm是否会在每次调用时评估这种/类似的疯狂程度? 解决方案 我不知道这是否可以作为答案,但似乎JVM可以证明不需 ..
发布时间:2021-02-12 18:57:01 Java开发

IntelliJIDEA for Scala中的Java字节码反编译器

我正在使用IntellijIDEA Ultimate Edition.浏览从java源代码编译的.class文件很容易:我可以双击.class文件,IDEA会反编译它. 但是,对于从scala源代码编译的.class文件,它不起作用.似乎IDEA只是引用scala源文件. 我注意到IDEA的行为仅与安装scala plugin的行为类似.没有它就可以正常工作.有没有一种方法可以在不关闭 ..
发布时间:2020-11-29 20:55:29 Java开发

空或空lambda作为默认值

哪种解决方案更好?使用可为空的lambda或将空lambda作为默认参数传递? Kotlin会优化空lambda吗?还是创建什么都不做的新实例? class Test1(val action:()-> Unit = {}) 不幸的是,我不理解生成的字节码。让我们分析 val test11 = Test1() 反编译后给我们 私有静态最终Test1 test11 = n ..
发布时间:2020-10-19 20:13:16 其他开发

如何检查java方法的字节码长度

此刻,我参加了一个大型遗留项目,其中包含许多巨大的类和生成的代码。 我希望找到字节码长度大于8000字节的所有方法(因为OOTB Java不会对其进行优化)。 我发现了这样的手动方式:在Java中,字节码有多少字节具有特定的方法? ,但是我的目标是自动扫描许多文件。 我尝试使用jboss-javassist,但是AFAIK获取字节码长度仅在类级别可用。 解决方案 但是,确实 ..
发布时间:2020-09-25 07:30:16 Java开发

此代码如何使用保留的关键字作为字段名称?

在尝试对服务器应用程序启动进行故障排除时,我在旧版 java字节码中发现了以下结构。 我的IDE反编译了一些第三方库,我很好奇它如何有效 -在关键字用作字段名称之前从未见过 字节码版本为48.0(Java 1.4)。 公共最终类f实现了UserContext { private final String try; 私人最终UserInfo做; //这里有很多代码 ..
发布时间:2020-09-25 07:30:10 Java开发

为什么Java字节码“存储”?经常跟随“负载”吗?

当我从一些小的Java函数中读取jvm字节码时,我发现当在操作数堆栈上计算一个新的局部变量时,假设它将存储在局部变量表中,但通常会将其加载到立即操作数堆栈(就字面意义而言,就字节码而言)。我对操作不太了解,是不必要的操作吗? 解决方案 Java编译器倾向于以非常简单的方式进行编译 例如,如果您写 x * = 3; x * = 4; ,您大概会得到字节码 iload_1 i ..
发布时间:2020-09-25 07:26:15 Java开发

JVM中操作数堆栈的作用是什么?

JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,需要 const 到操作数堆栈,然后 store 到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作? 解决方案 具有直接操作数的指令集必须进行编码每个指令中的操作数。相比之下,对于使用操作数堆栈的指令集,操作数是隐式的。 在查看小的琐碎运算(如加载a)时,隐式参数的优势并 ..
发布时间:2020-09-25 07:13:41 Java开发

Kotlin内联扩展属性

我知道 inline 关键字的意思是避免调用功能的电话开销.但是我不知道扩展属性可以用于什么内联? 假设我们有两个名为 foo 的扩展属性,另一个具有名为 bar 的内联属性 val Any.foo : Long get() = Date().time inline val Any.bar : Long get() = Date().time 执行其中任何一个,我们 ..
发布时间:2020-04-26 12:25:40 其他开发

bipush在JVM中如何工作?

我知道iload接受的是-1到5的整数,但是如何使用bipush指令扩展到更高的数字?特定的整数如何与字节码一起存储? 解决方案 有几种不同的指令可用于推送整数常量. 最小的是iconst_ *指令.这些只是一个字节,因为该值是在操作码本身中编码的. iconst_1,iconstt_2等是不同的操作码.例如,iconst_5将被编码为字节08. 注意:iload是完全不相关的 ..
发布时间:2020-04-25 07:34:24 Java开发

字节码中丢失了变量"final"修饰符?

分析这个简单类的字节码,我得出的结论是,编译器不保留有关局部变量final的任何信息.不过,这似乎很奇怪,因为我相信HotSpot编译器实际上可以使用此信息进行优化. 代码 : public static void main(String[] args) { final int i = 10; System.out.println(i); } 字节码 : pu ..
发布时间:2020-04-25 07:30:55 Java开发

为什么没有ICMP指令?

您可能已经知道,我们有大量的操作码用于比较不同类型的原始值: LCMP FCMPL FCMPG DCMPL DCMPG IFEQ IFNE IFLT IFGE IFGT IFLE IF_ICMPEQ IF_ICMPNE IF_ICMPLT IF_ICMPGE IF_ICMPGT IF_ICMPLE IF_ACMPEQ IF_ACMPNE ... 出于明显的原因,指令集的创建者没有费心去添 ..
发布时间:2020-04-25 07:26:03 Java开发