jvm-bytecode相关内容
我正在为 Java 创建一个静态分析工具,如果我可以从 .class 文件中的字节码中获取我正在分析的程序的一些信息,这些信息将更容易获得. 我不关心类文件中可能存在的每一个说明.例如,我可能只需要查看是否有任何 getfield 指令. 问题在于,由于每条指令的长度都是可变的,因此在一般情况下,我需要(在我的代码中)指定每个操作码的长度,然后才能确定(例如)getfield 指令开始
..
JVM 运行时数据区为每个正在执行的方法单独的堆栈.它包含操作数堆栈和局部变量.每次加载变量时,都需要const到操作数栈,然后store到局部变量.为什么不直接操作局部变量表,做一些看似重复的工作? 解决方案 具有直接操作数的指令集必须对每条指令中的操作数进行编码.相反,使用操作数堆栈的指令集,操作数是隐式的. 在查看诸如将常量加载到变量之类的小琐碎操作时,隐式参数的优势并不明显.
..
我想查看编译后的字节码,以便我可以详细了解它的工作原理.我正在使用 IntelliJ IDEA 15,但找不到查看字节码的方法.我错过了什么? 解决方案 IntelliJ IDEA 自带 Kotlin 的字节码查看工具: 工具 → Kotlin → 显示 Kotlin 字节码 也可以通过 Ctrl/⌘+Shift+A 作为 Show Kotlin Bytecode 操作使用.
..
在Java中,可以使用 InvocationHandler 的实现来创建动态代理.尽管JVM进行了优化,但使用反射总是会产生调用方法的一些开销. 为尝试解决此问题,我尝试使用ByteBuddy在运行时创建代理类,但是文档在这方面似乎不够清楚. 如何创建 MethodCallProxy 以便将方法调用转发到某些类实例? 编辑: 为了更好地阐明我的问题,我提供了一个我要实现的示
..
我一直在尝试通过ASM中的跳转来了解堆栈映射框架在Java中的工作方式.我创建了一个简单的方法来尝试一些操作:(用Krakatau分解): L0:ldc'hello'L2:astore_1L3:getstatic字段java/lang/System out Ljava/io/PrintStream;L6:新的java/lang/StringBuilderL9:dupL10:invokespec
..
我正在为我的自定义编程语言开发REPL.它在编译器的顶部实现,用于生成输入的字节码,并使用 sun.misc.Unsafe.defineClass(String,byte [],int,int,ClassLoader,ProtectionDomain)方法.相关代码如下所示(省略了诸如异常处理之类的不相关部分): void compileAndLoad(List可编
..
我尝试创建一个内部staic类,但是我发现字节码出现在jvm指令 ACONST_NULL 和 NEW , DUP 和 INVOKE_SPECIAL ,但是我知道新的一类是 新 DUP INVOKE_SPECIAL package com.hoho.api;/*** @作者linuxea*/公共班级主要{私有静态类InnerMain {//没有字段}公共静态void main(St
..
问题:第14行是什么意思? 使用javap -v -c分解以下代码: public class test { static int i = 2; public static void main(String[] args) { test x = new test(); System.out.println("text + Str
..
我敢肯定,几乎每个人都对这样.复制粘贴代码段以确保完整性: k = (j = (i = 0) + 2) + 1; return i|= j|= k|= (j+= i) - - (k+++k) - - (i =+j); 以上代码段始终返回11,无论如何.所以我的问题是:jvm是否会在每次调用时评估这种/类似的疯狂程度? 解决方案 我不知道这是否可以作为答案,但似乎JVM可以证明不需
..
我正在使用IntellijIDEA Ultimate Edition.浏览从java源代码编译的.class文件很容易:我可以双击.class文件,IDEA会反编译它. 但是,对于从scala源代码编译的.class文件,它不起作用.似乎IDEA只是引用scala源文件. 我注意到IDEA的行为仅与安装scala plugin的行为类似.没有它就可以正常工作.有没有一种方法可以在不关闭
..
哪种解决方案更好?使用可为空的lambda或将空lambda作为默认参数传递? Kotlin会优化空lambda吗?还是创建什么都不做的新实例? class Test1(val action:()-> Unit = {}) 不幸的是,我不理解生成的字节码。让我们分析 val test11 = Test1() 反编译后给我们 私有静态最终Test1 test11 = n
..
此刻,我参加了一个大型遗留项目,其中包含许多巨大的类和生成的代码。 我希望找到字节码长度大于8000字节的所有方法(因为OOTB Java不会对其进行优化)。 我发现了这样的手动方式:在Java中,字节码有多少字节具有特定的方法? ,但是我的目标是自动扫描许多文件。 我尝试使用jboss-javassist,但是AFAIK获取字节码长度仅在类级别可用。 解决方案 但是,确实
..
在尝试对服务器应用程序启动进行故障排除时,我在旧版 java字节码中发现了以下结构。 我的IDE反编译了一些第三方库,我很好奇它如何有效 -在关键字用作字段名称之前从未见过 字节码版本为48.0(Java 1.4)。 公共最终类f实现了UserContext { private final String try; 私人最终UserInfo做; //这里有很多代码
..
当我从一些小的Java函数中读取jvm字节码时,我发现当在操作数堆栈上计算一个新的局部变量时,假设它将存储在局部变量表中,但通常会将其加载到立即操作数堆栈(就字面意义而言,就字节码而言)。我对操作不太了解,是不必要的操作吗? 解决方案 Java编译器倾向于以非常简单的方式进行编译 例如,如果您写 x * = 3; x * = 4; ,您大概会得到字节码 iload_1 i
..
在JVM加载字节码期间,此java.lang.VerifyError带有如下代码段。 try { ----- } catch(NumberFormatException | CalculationException e){ } 此处CalculationException是自定义异常,它扩展了java.lang.RuntimeException,而NumberFo
..
JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,需要 const 到操作数堆栈,然后 store 到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作? 解决方案 具有直接操作数的指令集必须进行编码每个指令中的操作数。相比之下,对于使用操作数堆栈的指令集,操作数是隐式的。 在查看小的琐碎运算(如加载a)时,隐式参数的优势并
..
我知道 inline 关键字的意思是避免调用功能的电话开销.但是我不知道扩展属性可以用于什么内联? 假设我们有两个名为 foo 的扩展属性,另一个具有名为 bar 的内联属性 val Any.foo : Long get() = Date().time inline val Any.bar : Long get() = Date().time 执行其中任何一个,我们
..
我知道iload接受的是-1到5的整数,但是如何使用bipush指令扩展到更高的数字?特定的整数如何与字节码一起存储? 解决方案 有几种不同的指令可用于推送整数常量. 最小的是iconst_ *指令.这些只是一个字节,因为该值是在操作码本身中编码的. iconst_1,iconstt_2等是不同的操作码.例如,iconst_5将被编码为字节08. 注意:iload是完全不相关的
..
分析这个简单类的字节码,我得出的结论是,编译器不保留有关局部变量final的任何信息.不过,这似乎很奇怪,因为我相信HotSpot编译器实际上可以使用此信息进行优化. 代码 : public static void main(String[] args) { final int i = 10; System.out.println(i); } 字节码 : pu
..
您可能已经知道,我们有大量的操作码用于比较不同类型的原始值: 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 ... 出于明显的原因,指令集的创建者没有费心去添
..