Tag: jvm bytecode

从lambda对象获取MethodHandle

来自java.lang.invoke.LambdaMetafactory : 用于评估lambda表达式的推荐机制是将lambda体转移到方法,调用invokedynamic调用站点,其静态参数列表描述function接口的唯一方法和desugared实现方法,并返回一个对象(lambda对象)实现目标类型。 从检查来看,这至少是Oracle JDK的作用。 我的问题:给定一个lambda对象有没有办法找到实现方法的名称(或句柄)? 或者,给定一个实现方法列表,有没有办法告诉哪一个对应于给定的lambda对象?

为什么没有ICMP指令?

正如你们中的一些人可能知道的那样,我们有大量的操作码来比较不同类型的原始值: 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 … 由于显而易见的原因,指令集的创建者并没有费心添加所有IF_LCMPEQ , IF_FCMPLT ,……指令,但我想知道为什么没有ICMP指令,看到它对于布尔值或Integer.compare(int, int)非常有用Integer.compare(int, int) 。

Java字节码签名

作为我正在编写的编程语言的编译器的一部分,我在字节码中遇到了通用签名,我试图解析并转换为AST。 解析算法大多数都有效,但似乎有一种特殊情况,这些签名的格式有点奇怪。 以下是一些这样的情况: java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.lang.Class#getAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getAnnotationsByType: (Ljava/lang/Class;)[TA; java.lang.Class#getDeclaredAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getDeclaredAnnotationsByType: (Ljava/lang/Class;)[TA; java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.util.Collections#sort: <T::Ljava/lang/Comparable;>(Ljava/util/List;)V 在这些类中的所有方法中,这些是唯一在其签名中具有::的方法。 我的问题是这个令牌的作用以及它存在的原因。 编辑 我知道Java语言中的::运算符,但这是字节码级别的东西。