如果您有一个匿名类,例如
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
}
有了参考tester
的test
我怎么觉得这方法被调用?
如果您只想查看字节码:
javap -c -p -v classfile
^disassemble
^private methods
^verbose, including constant pool and bootstrap methods attribute
但是,如果您想尝试在运行时执行此操作,则很不走运(根据设计,我们没有像Expression Trees这样的东西),如另一个答案所示。
问题内容: 有谁知道在PHP中检查脚本是32位还是64位运行的方法?目前,我正在使用PHP 5.3.5。 理想情况下,我想编写一个函数,以便我的代码如下所示: 有人有什么想法吗? 问题答案: 检查常数。它会根据寄存器的大小(即32位和64位)而变化。 在32位系统中,应为 4 ;对于64位系统,应为 8 。
问题内容: 我得到了一些在程序中生成的Java字节码(即已编译的Java源代码)。现在,我想将此字节代码加载到当前运行的Java- VM中并运行特定功能。我不确定如何做到这一点,我对Java类加载器进行了一些研究,但没有找到直接的方法。 我找到了一个在硬盘上接收类文件的解决方案,但是我得到的字节码在字节数组中,我不想将其写入磁盘,而是直接使用它。 谢谢! 问题答案: 您需要编写一个自定义的类加载器
问题内容: 我试图在注释中包含一条动态消息,该消息根据传递给它的其他变量中的值来更改文本的主体。我设置了默认消息,但是当设置了某个指示器时,我想显示其他消息。这可能吗? 这是我的注释- 这是注释使用的验证器类- 我最感兴趣的部分是读取的代码- 问题答案: 这是我能够执行此操作的方式-
检查模块提供 inspect() 函数,它提供有关各种SQLAlchemy对象的运行时信息,包括核心和ORM中的这些对象。 这个 inspect() 函数是SQLAlchemy公共API的入口点,用于查看内存中对象的配置和构造。取决于传递给的对象的类型 inspect() 返回值要么是提供已知接口的相关对象,要么在许多情况下返回对象本身。 其基本原理是 inspect() 是双重的。其一是它不再需
问题内容: 现在我以下: 1)一个Java接口。 2),它的具体的java类 不 执行上述接口,但 不 包含的方法签名的接口中定义的方法中的每一个匹配。 由于我无法更改第2项的实现,因此我想知道是否可以使接受第1项实例作为参数的方法接受没有类强制转换的第2项。 感觉像Spring中的各种编织/强制/ AOP机制应该可以实现这一点,但是我不知道该怎么做。 有没有办法做到这一点? 问题答案: 您可以强
问题内容: 正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口中运行还是在IDLE中运行。是否只有在我可以检查的IDLE中运行时才存在的对象?环境变量? 我在Windows上使用的是Python 2.6.5和2.7。 编辑: 到目前为止给出的答案有效。 但是我正在寻找一种官方的方式来做到这一点,或者看起来像黑客一样。如果有人提出,我会接受的。否则,几天后,我会接受最早的答案。谢谢