Синтетические статические поля в Java с типом "java.lang.Class"
Я видел некоторые синтетические поля в классе org.jfree.data.time.RegularTimePeriod, и понятия не имею, для чего они и для чего. Я использую этот код, чтобы узнать их:
for (Field f : RegularTimePeriod.class.getDeclaredFields())
if (f.isSynthetic()) System.out.println(f);
И это даст:
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$java$util$Date
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$java$util$TimeZone
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Year
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Quarter
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Month
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Day
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Hour
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Minute
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Second
static java.lang.Class org.jfree.data.time.RegularTimePeriod.class$org$jfree$data$time$Millisecond
Любое тело есть идеи? Мне просто любопытно:) Спасибо.
1 ответ
Насколько я знаю, synthetic members are only meant to be accessed by trusted code generated by the compiler, not haphazardly by reflection.
Компилятор синтезирует определенные скрытые поля и методы для реализации определения имен. Эти поля являются частными, если не указано иное, или они находятся в большей части области действия пакета.
Синтетическое поле, указывающее на наиболее удаленный экземпляр, называется this$0
, Следующий внешний экземпляр this$1
, и так далее. (Не более одного такого поля необходимо в любом данном внутреннем классе.) Синтетическое поле, содержащее копию константы v
назван val$v
, Эти поля final
,
Все эти синтетические поля инициализируются параметрами конструктора, имена которых совпадают с именами полей, которые они инициализируют. Если один из параметров является самым внутренним включающим экземпляром, он является первым. Все такие параметры конструктора считаются синтетическими. Если компилятор определяет, что значение синтетического поля используется только в коде конструктора, он может опустить само поле и использовать только параметр для реализации ссылок на переменные.
Неприватный конечный синтетический метод, который предоставляет доступ к закрытому члену или конструктору, имеет имя вида access$N, где N - десятичное число. Организация таких протоколов доступа не определена.
Надеюсь, это поможет.
ура