标签: bytecode

为什么OpenJDK将私有方法放入vtable?

看来,OpenJDK的8位私有方法不属于final也不static成虚函数表.为什么当动态绑定不用于私有方法时(因为它们是用invokespecial调用的)或是否使用它?

java openjdk jvm bytecode

7
推荐指数
1
解决办法
198
查看次数

字节码和汇编语言是一回事吗?

这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢

assembly cil bytecode virtual-machine machine-code

7
推荐指数
1
解决办法
1108
查看次数

为什么java字节码"存储"通常后跟"加载"?

当我从一些小的java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?

java bytecode jvm-bytecode

7
推荐指数
2
解决办法
468
查看次数

Scala - Java互操作:Scala可以在字节码中发出枚举以供Java使用吗?

我有一个混合Java/Scala的项目,它是使用Scala库的Java GUI代码.有没有办法编写Scala代码,以便在编译时发出Java枚举?到目前为止我尝试过的方法(密封的case类,扩展Enumeration)似乎生成了正常的类,这使得从Java中使用它们比直接枚举更加繁琐.

java enums interop scala bytecode

6
推荐指数
1
解决办法
1236
查看次数

使用javassist用字节码中的方法替换java运算符

我的目标

为了能够在运行时检测何时进行比较(或任何其他操作,如*, - ,/,>,<,......

应该使用Javassist或ow2 ASM来编辑类的字节码

必须实现的目标

这段代码

public class Test{

    public void m(){

        if(a>2){
        //blablabla         
        }

    }  

}
Run Code Online (Sandbox Code Playgroud)

必须成为

public class Test{

    public void m(){

        if(someExternalClass.greaterThan(a,2)){
            //blalbla           
    }

    }

}
Run Code Online (Sandbox Code Playgroud)

greaterThan将返回与'>'完全相同的结果,但也将用于保存比较量每次进行比较时都会通知外部类

额外的说明

必须在有操作的任何地方进行.所以不仅在if语句中.

这意味着

int a = c+d;
Run Code Online (Sandbox Code Playgroud)

也必须成为

int a = someExternalClass.add(c,d);
Run Code Online (Sandbox Code Playgroud)

您对如何使用Javassist或其他库实现此目的有任何建议吗?

我想它与像IFLT,IFGT这样的OpCodes有关

java bytecode bytecode-manipulation javassist java-bytecode-asm

6
推荐指数
1
解决办法
721
查看次数

简单if语句与普通if语句

在Java字节代码级别,简单的if语句(示例1)和普通的if语句(示例2)之间是否有任何区别:

例1:

if (cond) statement;
Run Code Online (Sandbox Code Playgroud)

例2:

if (cond) {
    statement;
}
Run Code Online (Sandbox Code Playgroud)

问题的背景是,我在"高性能"类中看到过,java.awt.Rectangle而且Point只看到没有花括号的变体.

是否有任何速度优势,或者只是代码风格?

java performance if-statement bytecode curly-braces

6
推荐指数
2
解决办法
511
查看次数

使用字节代码进行Java调试

我想知道是否有任何支持混合模式调试的IDE或Eclipse插件.当我搜索术语混合模式时,发现许多引用调试VM语言以及本机代码.

但是我指的是一个类似于C语言编译语言的功能,用户可以看到C源代码行和相应的装配线,并且即使在汇编级别也可以进入.(请原谅如果我通过将该功能称为混合模式而犯了一个术语错误)

换句话说,我在调试java时正在寻找以下功能:

  1. 能够在程序执行期间使用java源代码和相应的字节代码
  2. 能够查看JVM PC寄存器和操作数堆栈
  3. 能够查看其他JVM特定数据结构(例如常量池)

这是为了理解Java源代码如何映射到字节代码以及在插入时如何影响各种JVM关联的数据结构.

java debugging bytecode

6
推荐指数
1
解决办法
1053
查看次数

要编译到常量池中的MethodHandle的Java代码


我试图让Java 8 Nashorn拥有完整的源代码(未经过检测).您可能知道,它使用Nasgen修改.classes,并输出输出JRE/lib/ext/nashorn.jar.


在拆卸输出时,使用javap:

 0: aload_0
 1: ldc           #24                 // String Function
 3: ldc           #31                 // MethodHandle invokestatic jdk/nashorn/internal/objects/NativeFunction.function:(ZLjava/lang/Object;[Ljava/lang/Object;)Ljdk/nashorn/internal/runtime/ScriptFunction;
 5: getstatic     #22                 // Field $nasgenmap$:Ljdk/nashorn/internal/runtime/PropertyMap;
 8: aconst_null
 9: invokespecial #34                 // Method jdk/nashorn/internal/objects/ScriptFunctionImpl."<init>":(Ljava/lang/String;Ljava/lang/invoke/MethodHandle;Ljdk/nashorn/internal/runtime/PropertyMap;[Ljdk/nashorn/internal/runtime/Specialization;)V
Run Code Online (Sandbox Code Playgroud)

可能被错误地写为

super("Function", NativeFunction.function, $nasgenmap$, (Specialization[]) null);
Run Code Online (Sandbox Code Playgroud)

,应该使用签名调用超级构造函数:

ScriptFunctionImpl(String, MethodHandle, PropertyMap, Specialization[]) { }
Run Code Online (Sandbox Code Playgroud)



我的问题是第二个参数NativeFunction.function,我没有可编译的源,MethodHandle在常量池中生成相同的,

  #31 = MethodHandle       #6:#30         //  invokestatic jdk/nashorn/internal/objects/NativeFunction.function:(ZLjava/lang/Object;[Ljava/lang/Object;)Ljdk/nashorn/internal/runtime/ScriptFunction;
Run Code Online (Sandbox Code Playgroud)

仪表的这一部分是由ASM通过调用MethodVisitor.visitLdcInsn完成的.

那么,有没有办法从Java源构建这样的方法句柄,或者这是一个只能在字节码级别完成的功能?

完整的javap输出:

$javap -c -v NativeFunction$Constructor.class

  Last modified …
Run Code Online (Sandbox Code Playgroud)

java decompiling bytecode methodhandle nashorn

6
推荐指数
1
解决办法
349
查看次数

为什么Java编译器没有优化一个简单的方法?

我有一个简单的类用于说明目的:

public class Test {

    public int test1() {
        int result = 100;
        result = 200;
        return result;
    }

    public int test2() {
        return 200;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器生成的字节码(检查者javap -c Test.class)如下:

public int test1();
Code:
   0: bipush        100
   2: istore_1
   3: sipush        200
   6: istore_1
   7: iload_1
   8: ireturn

public int test2();
Code:
   0: sipush        200
   3: ireturn
Run Code Online (Sandbox Code Playgroud)

为什么编译器没有将test1方法优化为为该方法生成的相同字节码test2?我希望它至少可以避免result变量的冗余初始化,因为很容易得出结论100根本没有使用该值.

我用Eclipse编译器和javac.

javacversion 1.8.0_72:,与Java一起作为JDK的一部分安装:

Java(TM) SE Runtime Environment (build …
Run Code Online (Sandbox Code Playgroud)

java bytecode javac compiler-optimization

6
推荐指数
2
解决办法
423
查看次数

为什么在dis.dis下反汇编这两个函数具有相同的字节码?

接下来是四个具有相同输出的函数,但是要么用列表理解,要么用紧密循环编写,并且对vs内联条件进行函数调用。

有趣的是,a并且b在反汇编时具有相同的字节码,但是b比快得多a。

此外,d使用没有函数调用的紧密循环的,比a使用带有函数调用的列表理解的函数要快。

为什么函数a和b具有相同的字节码,为什么b的性能要比给定的相同字节码好得多?

import dis

def my_filter(n):
    return n < 5

def a():
    # list comprehension with function call
    return [i for i in range(10) if my_filter(i)]

def b():
    # list comprehension without function call
    return [i for i in range(10) if i < 5]

def c():
    # tight loop with function call
    values = []
    for i in range(10):
        if my_filter(i):
            values.append(i)
    return values

def d(): …
Run Code Online (Sandbox Code Playgroud)

python bytecode python-3.x python-3.6

6
推荐指数
1
解决办法
279
查看次数