In enum class $VALUES field is synthetically created by the compiler (check out this example as well):
package com.logicbig.example.field;
import java.lang.reflect.Field;
import java.time.DayOfWeek;
public class IsSyntheticExample {
public static void main(String... args) {
for (Field field : DayOfWeek.class.getDeclaredFields()) {
if (field.isSynthetic()) {
System.out.println("Synthetic Field: " + field.getName());
System.out.println("Synthetic Field type: "+field.getType().getTypeName());
}
}
}
}
Output
Synthetic Field: $VALUES
Synthetic Field type: java.time.DayOfWeek[]
All inner classes have a synthetic instance field variable pointing to the outer class (check out this tutorial):
package com.logicbig.example.field;
import java.lang.reflect.Field;
public class IsSyntheticExample2 {
public static void main(String... args) {
for (Field field : MyInnerClass.class.getDeclaredFields()) {
if (field.isSynthetic()) {
System.out.println("Synthetic Field: " + field.getName());
System.out.println("Synthetic Field type: " + field.getType().getTypeName());
}
}
}
private class MyInnerClass {}
}
Output
Synthetic Field: this$0
Synthetic Field type: com.logicbig.example.field.IsSyntheticExample2