读完这篇文章你将会收获到
synthetic fields
synthetic method
synthetic class
概述
上一篇 Java 枚举 提及到编译成 class 文件之后、编译器会在枚举类里帮我们生成一个 VALUES 的静态数组 , 这种编译器生成的都有一个 flag 叫做 synthetic
image
那么 synthetic 的定义是什么、什么情况下才会有这个 flag ?
由编译器生成的,在源代码中没有出现的,都会被标记为 synthetic。当然有一些例外的情况:默认的构造函数、类的初始化方法、以及枚举类中的 value 和 valueOf 方法
synthetic fields
非常常见的一个例子
public class Father {
class Son {
}
}
我们都知道在一个内部类中,可以直接访问外部类的属性和方法,因为在内部类中是存在一个外部类的一个引用变量,而这个引用变量即是编译器帮我们生成的、也就是一个 synthetic 的属性
image
我们再写一个测试来验证下
Class clazz = Father.Son.class;
Field[] declaredFields = clazz.getDeclaredF