java中的合成静态字段,类型为“java.lang.Class”

时间:2013-05-13 08:25:28

标签: java reflection synthetic

我在类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 个答案:

答案 0 :(得分: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

所有这些合成字段都由构造函数参数初始化,这些参数与它们初始化的字段具有相同的名称。如果其中一个参数是最里面的封闭实例,则它是第一个。所有这些构造函数参数都被认为是合成的。如果编译器确定合成字段的值仅在构造函数的代码中使用,则它可以省略该字段本身,并仅使用该参数来实现变量引用。

授予私有成员或构造函数访问权限的非私有最终合成方法的格式为访问$ N,其中N是十进制数字。此类访问协议的组织未指定。

我希望这会有所帮助。

干杯