Tag: 字节码

如何将ByteCode转换为机器本机代码

我正在寻找一个翻译器,用于在执行之前将Java ByteCode转换为Machine Native Code以提高性能。 我听说OpenOffice是用JAVA编写的,但我在他的安装文件夹中看不到任何jar文件,因此,也许有翻译但我找不到它。 有谁知道这样做的工具或商业产品? 谢谢!

对字节码和对象的澄清

我正在写一个字节码指导员。 现在,我试图找出在对象存在的情况下如何做到这一点。 我想对我在JVMS中阅读的两行(第4.9.4节)做一些澄清: 1)“validation者在初始化之前拒绝使用新对象的代码。” 我的问题是,“使用”在这里意味着什么? 我猜这意味着:将它作为方法属性传递,在其上调用GETFIELD和PUTFIELD ,或者调用它上面的任何实例方法。 他们的其他禁止用途? 我相信它可以遵循其他指令,如DUP , LOAD和STORE 。 2)“在该方法调用myClass的另一个实例初始化方法或其直接超类之前,该方法可以对此执行的唯一操作是分配在myClass中声明的字段。” 这意味着在方法中,在调用另一个之前允许GETFIELD和PUTFIELD。 但是,在Java中,在调用super()或this()之前对实例字段执行任何操作都会导致编译错误。 有人可以澄清一下吗? 3)我还有一个问题。 对象引用何时初始化,因此可以自由使用? 通过阅读JVMS,我想出了一个对象是否被初始化的答案,取决于每种方法。 在某个时间点,可以为方法初始化对象,但不能为另一个方法初始化对象。 具体来说,当该方法调用的返回时,对象的方法被初始化。 例如,考虑main()方法创建了一个对象并调用了 ,然后调用了超类的 。 从super()返回后,该对象现在被认为是由初始化的,但尚未为main()初始化。 这是否意味着,在super()之后的 ,我可以将对象作为参数传递给方法,甚至在返回到main()之前。 有人可以证实这整个分析是真的吗? 感谢您的时间。 ps:我实际上已经向Sun论坛发布了相同的问题,但回复。 我希望我能在这里有更多的运气。 谢谢。 更新 首先感谢您的答案和时间。 虽然我没有得到一个明确的答案(我有很多问题,其中一些有点模糊),但你的答案和例子,以及随后的实验,对于我更深入地了解JVM如何工作非常有用。 我发现的主要问题是Verifier的行为因不同的实现和版本而不同(这使得字节码操作的工作变得更加复杂)。 问题在于不符合JVMS,或者validation者的开发人员缺乏文档,或者JVMS在validation者的区域中有一些微妙的模糊性。 最后一件事,SO Rocks !!! 我在官方的Sun JVM规范论坛上发布了同样的问题,直到现在我仍然没有回答。

为什么以下代码转换为java字节码中的新+ dup op指令?

假设我有一个Fraction类: class Fraction { … /** Invert current fraction */ public Fraction inverse() { return new Fraction(den,num); } … } 这就是上述方法的字节码结果如下: 0 new #1 3 dup 4 aload_0 5 getfield #16 8 aload_0 9 getfield #14 12 invokespecial #27 <xyzTestes/system/fraction/Fraction.> 15 areturn 我试图理解为什么第3位的教学首先放在那里。 我要说我们只需要做以下工作就可以了: new #1 aload_0 getfield #16 aload_0 getfield #14 invokespecial #27 <xyzTestes/system/fraction/Fraction.> […]

Java注释的默认值是否编译为字节码?

我尝试为Java字节码实现几个静态分析。 他们试图计算某个方法是否具有特定属性,例如是工厂方法。 因为这些分析很难测试,所以我决定编写一些Java代码并使用正确的属性直接注释方法。 运行分析后,很容易自动检查计算属性和带注释的属性是否相同。 MyAnnotation: @Retention(RUNTIME) @Target(METHOD) public @interface FactoryMethodProperty { FactoryMethodKeys value() default FactoryMethodKeys.NonFactoryMethod; } 示例测试代码: public class PublicFactoryMethod { private PublicFactoryMethod(){ // I’m private } @FactoryMethodProperty public static void newInstanceAfterOtherConstructorCall(){ new TransFacoryMethod(); new PublicFactoryMethod(); } @FactoryMethodProperty(FactoryMethodKeys.IsFactoryMethod) public static PublicFactoryMethod newInstance(){ return new PublicFactoryMethod(); } } 因为我的测试代码中的大多数方法都不是工厂方法,所以我将默认设置为枚举值“FactoryMethodKeys.NonFactoryMethod”。 但是当我没有将枚举值显式传递给注释时,它不会被编译为字节码。 字节码: #23 = Utf8 value #24 […]

Java中的自定义类加载器

是否可以在java中创建自己的自定义类加载器。 如果是那么请指导我。 我想在类文件中进行更改而不是类混淆,这样就无法通过任何工具进行反转

如何为字符串执行switch case?

我对switch-case声明有疑问。 这是我的代码: String month = “April”; switch (month.toLowerCase()) { case “january”: monthNumber = 1; break; case “february”: monthNumber = 2; break; case “march”: monthNumber = 3; break; case “april”: monthNumber = 4; break; 等等.. 在这方面我有3个问题: 1)将月份与案例值进行比较,即案例“1月”,案例“2月”。编译器从以下内容中使用了什么? – month.equals(“case-value”)? – 月==案例值? 2)并且case-values内部转换为StringBuilder / StringStringBuffer或者只是它们仍然是String对象?? 3)我如何从字节代码中知道这一点,即是否有任何可用的工具,我可以直接查看编译器生成的代码,以了解内部的行为如何?

将JVM字节码往返的文本表示和返回的故障安全方法

我正在寻找一种故障安全的方法来在JVM类文件和文本表示之间往返,然后再返回。 一个严格的要求是,只要文本表示保持不变,生成的往返JVM类文件在function上与原始JVM类文件完全等效。 此外,文本表示必须是人类可读和可编辑的。 应该可以对文本表示进行小的更改(例如更改文本字符串或类名等),这些更改会反映在生成的类文件表示中。 最简单的解决方案是使用Java反编译器(如JAD)生成文本表示,在这种情况下,它只是重新创建的Java源代码。 然后使用javac生成字节码。 但是,鉴于免费Java反编译器的状态,这种方法在所有情况下都不起作用。 创建混淆的字节代码相当容易,这些字节代码不能在完整的往返类文件/ java-source / class-file中存活(部分原因是因为JVM字节代码之间没有1:1的映射) Java源代码)。 根据上述要求,是否存在实现JVM类文件/文本表示/类文件往返的故障安全方法? 更新:在回答之前 – 通过阅读上述所有要求节省时间和精力,并具体说明: “JVM字节码的文本表示”并不一定意味着“Java源代码”。

不同的Java编译器(供应商不同)会产生不同的字节码

给定相同的主要版本,比如Java 7,做不同的Java编译器(例如,Oracle的热点,JRockit或IBM的J9等……)将给定的java源代码文件编译成相同的bytcode? 扫描Java 7语言规范似乎正在讨论的是语言的语义,而不是将代码转换为字节码。 这个问题与不同的major.minor版本不同,给定供应商生成相同的字节码。 这个问题已在这里得到解答 – 可能是 。 从以下答案到Java类文件的创建是否确定? 并且对这个答案的评论引用了这个问题以及对于1和2上面的major.minor问题的两个答案,我认为我的问题的答案是肯定的 。 上述摘录如下: JLS留下了许多实现细节,从一个实现到另一个实现。 和 但是,JLS没有指定从源代码到生成的字节代码的1:1映射,因此您不应该依赖于生成完全相同的字节代码。 然而, 这里的评论意味着不同: 它是编译器,即javac,使用BLAH BLAH BLAH创建代码。 这与HotSpot无关。 这意味着给定代码X所有javac实现(相同版本/不同供应商)必须生成相同的Y字节码。 我不明白这是怎么回事,但我无法证实它不是(或者我认为,见上文)是正确的。 能给出明确的答案吗?

热点JVM Bytecode Interpreter是一个跟踪JIT吗?

这个问题几乎说明了一切,即使通过VM规范,我也一直在寻找答案,但我没有明确说明。

java反编译

当使用java反编译器(http://java.decompiler.free.fr/)反编译一个特定的jar时,我得到了一些奇怪的代码,我无法识别它是什么。 有人能帮我吗? 代码是这样的: Foo.access$004(Foo.this); 或这个 Bar.access$006(Bar.this); 要不然 Baz.access$102(Baz.this, true) 这些方法有什么access$004 , access$006和access$102 ?