相关疑难解决方法(0)

"静态合成"是什么意思?

我正在查看从Java字节码获取的一些反汇编代码.我看到一些声明如下:

.method static synthetic access$0()Lcom/package/Sample;
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚什么syntheticaccess$0意味.有人可以帮我理解这部分吗?

java bytecode disassembly java-synthetic-methods

25
推荐指数
2
解决办法
9303
查看次数

Lambda 字段捕获局部变量 .isSynthetic() 返回 false

在回答这个关于捕获局部变量的 lambda 的问题时,我定义了一个简单的 lambda 来捕获一个局部变量,并表明 lambda 有一个包含该变量值的字段。根据各种来源(例如此处此处),当 lambda 捕获局部变量时,其值存储在“合成”字段中。Java 虚拟机规范(第4.7.8 节)似乎暗示了这一点,其中说:

未出现在源代码中的类成员必须使用 Synthetic 属性进行标记,否则必须设置其 ACC_SYNTHETIC 标志。此要求的唯一例外是编译器生成的方法,它们不被视为实现工件,即表示 Java 编程语言的默认构造函数的实例初始化方法(第 2.9.1 节)、类或接口初始化方法(第 2.9.2 节) ),以及 Enum.values() 和 Enum.valueOf() 方法。

lambda 的字段不是定义的异常之一,并且 lambda 的字段未在源代码中声明,因此根据我的理解,该字段应该是根据此规则合成的。

通过反射可以很容易地证明场的存在。但是,当我使用该Field.isSynthetic方法进行检查时,它实际上返回false. 这种方法的文档说:

如果此字段是合成字段,则返回 true;否则返回 false。

我正在 Java 10.0.1 中使用 JShell 进行测试:

> class A { static Runnable a(int x) { return () -> System.out.println(x); } }
|  created class A

> Runnable r …
Run Code Online (Sandbox Code Playgroud)

java lambda closures language-lawyer java-10

8
推荐指数
1
解决办法
229
查看次数

什么是对内部类的合成反向引用

我正在寻找我的应用程序中的内存泄漏和我使用的分析器告诉我寻找这些类型的引用,但我不知道我在寻找什么.有人可以解释一下吗?

谢谢,

埃利奥特

java memory memory-leaks

3
推荐指数
1
解决办法
937
查看次数