Tag: 字节码

在字节码中确定哪里是super()方法调用,所有构造函数必须在JVM上执行

我想知道在分析构造函数的字节码时是否有一种明显而快速的方法,以确定super()代码的结束位置。 更具体地说,与Java形成鲜明对比的是,构造函数中对任何super()构造函数方法的调用是可选的(或者更确切地说,当不存在时 – 隐式),在字节码世界中总是需要它。 出于黑魔法的目的,我需要通过字节码分析和最简单的方法来了解什么是与Java世界的super()调用相对应的INVOKESPECIAL调用。 我会带着一个简单的例子离开这里: public static class A { public A(Object o, Object b) { } } public static class B extends A { public B() { //the below super is in bold just to signal that’s the one //I’m looking for SUPER(new A(new Object(), new Integer(2)), new Integer(1)); System.out.println(new A(new Object(), new […]

二进制运算符执行何时在Java中执行?

我正在尝试理解java字节码。 我从简单的例子开始: public class Test { public static void main(String args[]) { System.out.println(2 + 1); } } 我编译了这个类: javac Test.java 然后我尝试在.class上的javap像这样: javap -c Test 这给了我这个: Compiled from “Test.java” public class Test { public Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.””:()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2 // Field […]

使用Asm字节码生成器生成具有generics类型的方法(ClassWriter)

使用Asm很容易定义简单的getter和setter(幸运的是,甚至在他们的FAQ中也有解释)。 但有一件事未提及,而我无法找到文档,是如何使用generics类型信息来实现这些。 我实际上能够很容易地确定generics类型信息(因为代码将采用现有的字段和/或方法,并且存在完整的generics类型处理和解析)。 我只需要为包含generics类型的类型生成generics版本。 我希望这就像修改签名的Asm ClassWriter / MethodVisitor调用一样容易,但文档中的一些注释表明它可能不那么容易(因为generics信息存储在与常规信息不同的位置)。 编辑 :看起来入口点是“ClassWriter.visitField / Method(….,String signature) – 请注意,它的”描述“包含正常的非generics类信息,但术语”签名“(在JLS中)具体指的是到generics – 包括类型信息。

java字节码 – 小于int的类型的表示

在我大学的一个项目中,我直接使用Java字节码。 在浏览了可用于JVM的指令列表( http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings )之后,我发现没有[b|c|s]store,这样的东西[b|c|s]store,只有用于存储整数的东西。局部变量。 这是否意味着如果在我的程序中我写道: short a; int b; 我没有保存任何内存,因为每个局部变量条目占用4个字节? 我一直认为使用short或byte类型会在运行时节省一些内存。

字节码是否被视为JVM的指令集?

我正在阅读维基中的 instruction set ,我看到了这段话: 一些支持字节码作为其ISA的虚拟机,如Smalltalk,Java虚拟机和Microsoft的公共语言运行时,通过将常用代码路径的字节码转换为本机机器码来实现。 此外,这些虚拟机通过解释执行不常用的代码路径(请参阅:即时编译)。 Transmeta以这种方式在VLIW处理器上实现了x86指令集。 这究竟意味着什么? bytecodes是用于JVM ISA ,而JVM又支持处理器的ISA 。

Google App Engine如何预编译Java?

App Engine使用“预编译”过程和应用程序的Java字节码来增强Java运行时环境中应用程序的性能。 预编译代码的function与原始字节码相同。 有什么详细信息吗?

类文件格式的最终​​变量

类文件格式是否支持最终关键字,以便将其与变量一起使用? 或者它只是从代码中推断出变量的有效终结性而JIT编译器基于它执行优化? 这里 ,在类文件格式文档中,他们提到了关于final关键字,但仅限于将其与final块和final类一起使用的情况。 最终变量没有任何内容。

使用Haskell将函数注入Java .class文件

我使用Haskell编写了一个Java字节码解析器,它运行得很好。 然而,下一步让我完全难过。 我的Haskell程序需要修改.class文件,以便在执行时,Java程序打印: “在执行方法之前输入[此处的方法名称] ”,和 执行方法后“ 退出[此处的方法名称] ”。 我所知道的是,我们需要通过调用System.out.println来附加常量池和方法表,但我觉得我仍然缺少一些东西。 解决这个问题的最佳方法是什么? 你怎么知道如何在字节码中调用System.out.println ? 如何使用方法名称存储字符串,以后将其作为System.out.println的参数调用?

ilasm / ildasm的Java字节码等价物

对于CIL / MSIL,我可以在文本编辑器中编写代码,并使用ilasm / ildasm进行编译/反编译。 我可以使用Reflector查看.NET类生成的CIL。 在Java世界中,javap -c显示了反汇编的字节代码。 如何编译Java字节码? (即Ilasm / ildasm的Java等价物)。 是否有支持Java字节码的IDE? IDE是否支持调试,即单步执行/断点等?

为什么static / member变量比局部变量慢?

我见过这个post: 速度与条件相比 我自己上课检查速度 public class Question { static long startTime; static long elapsedTime; static String mStatic; private String mPublic; public static void main(String[] args) { Question q = new Question(); q.executeGlobal(); q.executeStatic(); q.executeLocal(); } public void executeLocal() { String mLocal; startTime = System.nanoTime(); for (int i = 0; i < 1000000000; i++) { mLocal = […]