看来,OpenJDK的8位私有方法不属于final也不static成虚函数表.为什么当动态绑定不用于私有方法时(因为它们是用invokespecial调用的)或是否使用它?
这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢
当我从一些小的java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?
我有一个混合Java/Scala的项目,它是使用Scala库的Java GUI代码.有没有办法编写Scala代码,以便在编译时发出Java枚举?到目前为止我尝试过的方法(密封的case类,扩展Enumeration)似乎生成了正常的类,这使得从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
在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只看到没有花括号的变体.
是否有任何速度优势,或者只是代码风格?
我想知道是否有任何支持混合模式调试的IDE或Eclipse插件.当我搜索术语混合模式时,发现许多引用调试VM语言以及本机代码.
但是我指的是一个类似于C语言编译语言的功能,用户可以看到C源代码行和相应的装配线,并且即使在汇编级别也可以进入.(请原谅如果我通过将该功能称为混合模式而犯了一个术语错误)
换句话说,我在调试java时正在寻找以下功能:
这是为了理解Java源代码如何映射到字节代码以及在插入时如何影响各种JVM关联的数据结构.
我试图让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) 我有一个简单的类用于说明目的:
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) 接下来是四个具有相同输出的函数,但是要么用列表理解,要么用紧密循环编写,并且对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) bytecode ×10
java ×8
assembly ×1
cil ×1
curly-braces ×1
debugging ×1
decompiling ×1
enums ×1
if-statement ×1
interop ×1
javac ×1
javassist ×1
jvm ×1
jvm-bytecode ×1
machine-code ×1
methodhandle ×1
nashorn ×1
openjdk ×1
performance ×1
python ×1
python-3.6 ×1
python-3.x ×1
scala ×1