您可以在运行时检查Java 8 lambda的字节码吗?

彼得·劳瑞

如果您有一个匿名类,例如

Predicate<String> isEmpty = new Predicate<String>() {
    public boolean test(String t) {
        return t.isEmpty();
    }
};

传递给引用的库isEmpty可以检查字节码以查看其作用并可能对其进行操作。有没有办法为lambda做到这一点?

Predicate<String> isEmpty = String::isEmpty;

例如说有这个代码和字节码

public class Main {
    public static void test(Predicate<String> tester) {
        System.out.println("tester.getClass()= " + tester.getClass());
        System.out.println("tester.getClass().getClassLoader()="+ tester.getClass().getClassLoader());
    }
    public static void main(String... args) {
        Predicate<String> isEmpty = String::isEmpty;
        test(isEmpty);
    }
}

$ javap -cp . -c -private Main.class
Compiled from "Main.java"
public class Main {
  public Main();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void test(java.util.function.Predicate<java.lang.String>);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: new           #3                  // class java/lang/StringBuilder
       6: dup           
       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      10: ldc           #5                  // String tester.getClass()= 
      12: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      15: aload_0       
      16: invokevirtual #7                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      19: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      22: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      25: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      28: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      31: new           #3                  // class java/lang/StringBuilder
      34: dup           
      35: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      38: ldc           #11                 // String tester.getClass().getClassLoader()=
      40: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      43: aload_0       
      44: invokevirtual #7                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      47: invokevirtual #12                 // Method java/lang/Class.getClassLoader:()Ljava/lang/ClassLoader;
      50: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      53: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      56: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      59: return        

  public static void main(java.lang.String...);
    Code:
       0: invokedynamic #13,  0             // InvokeDynamic #0:test:()Ljava/util/function/Predicate;
       5: astore_1      
       6: aload_1       
       7: invokestatic  #14                 // Method test:(Ljava/util/function/Predicate;)V
      10: return        
}

有了参考testertest我怎么觉得这方法被调用?

布莱恩·格茨

如果您只想查看字节码:

javap -c -p -v classfile
      ^disassemble
         ^private methods
            ^verbose, including constant pool and bootstrap methods attribute

但是,如果您想尝试在运行时执行此操作,则很不走运(根据设计,我们没有像Expression Trees这样的东西),如另一个答案所示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

枚举,接口和(Java 8)lambda:代码可以编译,但在运行时会失败;这是预期的吗?

来自分类Dev

您可以在运行时检查对象是否符合Flow类型吗?

来自分类Dev

我可以在运行时检查内置类型吗?

来自分类Dev

您可以在运行时更改Type的Name属性的值吗?

来自分类Dev

您可以在运行时在XmlRootAttribute中设置名称空间字段吗?

来自分类Dev

C#8中的不可为空的引用类型在运行时可以为null吗?

来自分类Dev

您可以在应用程序在后台运行时检查试用版吗

来自分类Dev

Java 8 Lambda-运行时错误

来自分类Dev

是否可以在运行时访问Java 8类型信息?

来自分类Dev

我们可以在运行时检查动态数组的大小吗

来自分类Dev

Java:我可以在运行时将运行时异常注入到任意类方法中吗?

来自分类Dev

在运行时在Android上进行字节码操作

来自分类Dev

使用Java 8在运行时选择具体的实现

来自分类Dev

您可以在运行./configure时跳过“检查..”步骤吗?

来自分类Dev

可以在运行时使用Javascript创建函数吗?

来自分类Dev

Vulkan层可以在运行时更改吗?

来自分类Dev

可以在运行时自定义FilterProvider吗?

来自分类Dev

可以在运行时设置no_console_suspend吗?

来自分类Dev

可以在运行时填充 Android 活动吗?

来自分类Dev

我可以在运行时更新 AMQP 设置吗?

来自分类Dev

可以从脚本执行Python字节码吗?

来自分类Dev

Java字节码可以直接转换为汇编代码吗?

来自分类Dev

您可以使用旧的运行时库进行Visual c ++ 2013构建吗?

来自分类Dev

Proguard对Java8方法引用的混淆在运行时中断

来自分类Dev

我可以在运行时运行C#文件吗

来自分类Dev

xml 有变量吗?那么某些部分可以在运行时更换吗?

来自分类Dev

是否可以在运行时检索lambda表达式

来自分类Dev

是否可以在运行时检索lambda表达式

来自分类Dev

我怎么可以修复错误“反编译的.class文件字节码版本52.0(8的Java)

Related 相关文章

  1. 1

    枚举,接口和(Java 8)lambda:代码可以编译,但在运行时会失败;这是预期的吗?

  2. 2

    您可以在运行时检查对象是否符合Flow类型吗?

  3. 3

    我可以在运行时检查内置类型吗?

  4. 4

    您可以在运行时更改Type的Name属性的值吗?

  5. 5

    您可以在运行时在XmlRootAttribute中设置名称空间字段吗?

  6. 6

    C#8中的不可为空的引用类型在运行时可以为null吗?

  7. 7

    您可以在应用程序在后台运行时检查试用版吗

  8. 8

    Java 8 Lambda-运行时错误

  9. 9

    是否可以在运行时访问Java 8类型信息?

  10. 10

    我们可以在运行时检查动态数组的大小吗

  11. 11

    Java:我可以在运行时将运行时异常注入到任意类方法中吗?

  12. 12

    在运行时在Android上进行字节码操作

  13. 13

    使用Java 8在运行时选择具体的实现

  14. 14

    您可以在运行./configure时跳过“检查..”步骤吗?

  15. 15

    可以在运行时使用Javascript创建函数吗?

  16. 16

    Vulkan层可以在运行时更改吗?

  17. 17

    可以在运行时自定义FilterProvider吗?

  18. 18

    可以在运行时设置no_console_suspend吗?

  19. 19

    可以在运行时填充 Android 活动吗?

  20. 20

    我可以在运行时更新 AMQP 设置吗?

  21. 21

    可以从脚本执行Python字节码吗?

  22. 22

    Java字节码可以直接转换为汇编代码吗?

  23. 23

    您可以使用旧的运行时库进行Visual c ++ 2013构建吗?

  24. 24

    Proguard对Java8方法引用的混淆在运行时中断

  25. 25

    我可以在运行时运行C#文件吗

  26. 26

    xml 有变量吗?那么某些部分可以在运行时更换吗?

  27. 27

    是否可以在运行时检索lambda表达式

  28. 28

    是否可以在运行时检索lambda表达式

  29. 29

    我怎么可以修复错误“反编译的.class文件字节码版本52.0(8的Java)

热门标签

归档