欢迎来到爱乐透彩票网双色球开奖_爱乐透彩票网双色球走势图_爱乐透彩票网官方端口! 联系我们 网站地图

爱乐透彩票网双色球开奖_爱乐透彩票网双色球走势图_爱乐透彩票网官方端口

0379-65557469

爱乐透彩票网双色球走势图
全国服务热线
0379-65557469

电话: 0379-65557469
0379-63930906
0379-63900388 
0379-63253525   
传真: 0379-65557469
地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室 

爱乐透彩票网双色球走势图

爱乐透彩票网双色球开奖-Java 中冷门的 synthetic 关键字原理解读

作者:admin 发布时间:2019-11-30 22:07:27 浏览次数:117
打印 收藏 关闭
字体【
视力保护色

看JAVA的反射时,看到有个synthetic ,还有一个办法isSynthetic() 很猎奇,就了解了一下:

1.界说

Any constructs introduced by a Java compiler that do not have a corresponding construct in the source code must be marked as synthetic, except for default constructors, the class initialization method, and the values and valueOf methods of the Enum class.

大意为:由java编译器生成的(除了像默许结构函数这一类的)办法,或许类

2.实例

已然知道synthetic办法和synthetic类是由编译器生成的,那究竟编译器会怎样生成这些东西,又在什么情况下会生成这些东西呢?

先看一段代码:

import static ja爱乐透彩票网双色球开奖-Java 中冷门的 synthetic 关键字原理解读va.lang.System.out;
public final class DemonstrateSyntheticMethods
{
public static void main(final String[] arguments)
{
DemonstrateSyntheticMethods.NestedClass nested =
new DemonstrateSyntheticMethods.NestedClass();
out.println("String: " + nested.highlyConfidential);
}
private static final class NestedClass
{
private String highlyConfidential = "Don't tell anyone about me";
private int highlyConfidentialInt = 42;
private Calendar highlyConfidentialCalendar = Calendar.getInstance();
private boolean highlyConfidentialBoolean = true;
}
}

编译之后,能够看到三个文件:

其间,最下面的这个类文件很好解说,便是咱们的主class,中心的文件,是咱们的内部类,上面的文件,后边再讲,咱们先看一下中心这个内部类

2.1 内部类的反编译成果

用javap 爱乐透彩票网双色球开奖-Java 中冷门的 synthetic 关键字原理解读反编译DemonstrateSyntheticMethods$NestedClass.class,得到如下成果:

javap DemonstrateSyntheticMethods\$NestedClass.class
Compiled from "DemonstrateSyntheticMethods.java"
final class DemonstrateSyntheticMethods$NestedClass {
DemonstrateSyntheticMethods$NestedClass(DemonstrateSyntheticMethods$1);
static java.lang.String access$100(DemonstrateSyntheticMethods$NestedClass);
}

先把结构函数放一边,咱们来看这个标黑的办法access$100 这个是怎样回事呢?咱们的源文件里找不到这个access办法啊?

2.2 synthetic办法

这个办法便是编译器生成的synthetic办法,读者不信的话,能够用method.isSynthetic() 去验证一下。

为何要生成这样一个办法呢?

能够看到,咱们的NestedClass类中,highConfidential是一个私有特点,而咱们在外部类DemonstrateSyntheticMethods中,直接引证了这个特点。作为一个内部类,NestedClass的特点被外部类引证,在语义上毫无问题,可是这却苦了编译器。

为了能让一个private的变量被引证到,编译器生成了一个package scope的access办法,这个办法便是一个get办法,在外部类运用highConfidential这个特点时,实践是运用了这个access办法。

在javap中能够看到直接的依据:爱乐透彩票网双色球开奖-Java 中冷门的 synthetic 关键字原理解读

图中红框的方位,能够很清楚的看到main办法实践上调用了access$100这个办法。

所以,定论很清楚了,编译器为了便利内部类的私有成员被外部类引证,生成了一个get办法,这能够被理解为一个trick,绕开了private成员变量的约束。

2.3 synthetic类

界说现已说到,编译器不仅仅会生成办法,也会生成synthetic类。

咱们回过头来看2.1说到的最终一个类DemonstrateSyntheticMethods$1.class

这个类是一个彻底的空类,反编译后是这个姿态:

// $FF: synthetic class
class DemonstrateSyntheticMethods$1 {
}

这个类只进场了一次,作为内部类NestedClass的package scope的结构函数,如图所示:

那么,这个类的效果呢?笔者查了许多材料,都没有清晰的阐明这个类的用处,只能依据代码做估测如下:

NestedClass作为一个private类,其默许结构函数也是private的。那么,事实上,作为外部类的DemonstrateSyntheticMethods类,没有办法new这个内部类的目标,而这和咱们需求的语义相违反。

那么,为了完成语义,编译器又用了一个trick,悄悄的生成了一个结构函数NestedClass(DemonstrateSy爱乐透彩票网双色球开奖-Java 中冷门的 synthetic 关键字原理解读nt返老还童heticMethods$1 obj), 这个结构函数是包可见的。

那么,外部类则能够经过new NestedClass(null)的办法,得到内部类的目标。假如读者检查一下main办法的爱乐透彩票网双色球开奖-Java 中冷门的 synthetic 关键字原理解读话,能够看到这个办法的调用如下图所示。

这便是这个synthetic类的效果。假如咱们给咱们的NestedClass 添加一个public等级的默许结构函数的话,则能够看到编译器不会再生成这个synthetic类。

3.定论

编译器经过生成一些在源代码中不存在的synthetic办法和类的办法,完成了对private等级的字段和类的拜访,然后绕开了言语约束,这能够算是一种trick。

在实践出产和使用中,根本不存在程序员需求考虑synthetic的当地。

版权所有:洛阳市建设工程咨询有限责任公司 联系人:李经理 电话: 地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室
版权所有 爱乐透彩票网双色球开奖 津ICP备140554428号-3