浅谈Java编程中的synthetic关键字

作者:mengwei 时间:2022-01-27 18:48:41 

java synthetic关键字。有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。

下面我给大家介绍一下synthetic

下面的例子是最常见的synthetic field

Java代码


class parent {
public void foo() {
}
class inner {
inner() {
foo();
}
}
}

非static的inner class里面都会有一个this$0的字段保存它的父对象。编译后的inner class 就像下面这样:
Java代码


class parent$inner{
synthetic parent this$0;
parent$inner(parent this$0)
{
this.this$0 = this$0;
this$0.foo();
}
}

所有父对象的非私有成员都通过 this$0来访问。
还有许多用到synthetic的地方。比如使用了assert 关键字的class会有一个synthetic static boolean $assertionsDisabled 字段
使用了assert的地方

assert condition;
在class里被编译成
Java代码


if(!$assertionsDisabled && !condition){
throw new AssertionError();
}

还有,在jvm里,所有class的私有成员都不允许在其他类里访问,包括它的inner class。在java语言里inner class是可以访问父类的私有成员的。在class里是用如下的方法实现的:

Java代码


class parent{
private int value = 0;
synthetic static int access$000(parent obj)
{
return value;
}
}

在inner class里通过access$000来访问value字段。
synthetic的概念

According to the JVM Spec: "A class member that does not appear in the source code must be marked using a Synthetic attribute." Also, "The Synthetic attribute was introduced in JDK release 1.1 to support nested classes and interfaces."

I know that nested classes are sometimes implemented using synthetic fields and synthetic contructors, e.g. an inner class may use a synthetic field to save a reference to its outer class instance, and it may generate a synthetic contructor to set that field correctly. I'm not sure if it Java still uses synthetic constructors or methods for this, but I'm pretty sure I did see them used in the past. I don't know why they might need synthetic classes here. On the other hand, something like RMI or java.lang.reflect.Proxy should probably create synthetic classes, since those classes don't actually appear in source code. I just ran a test where Proxy did not create a synthetic instance, but I believe that's probably a bug.

Hmm, we discussed this some time ago back here. It seems like Sun is just ignoring this synthetic attribute, for classes at least, and we should too.

注意上文的第一处黑体部分,一个类的复合属性表示他支持嵌套的类或者接口。

注意上文的第二处黑体部分,说明符合这个概念就是OO思想中的类的复合,也就是只要含有其它类的引用即为复合。

来源:https://www.2cto.com/kf/201703/618626.html

标签:java,synthetic,关键字
0
投稿

猜你喜欢

  • AndroidStudio3.6.1打包jar及AndroidStudio4.0打包jar的一系列问题及用法

    2021-09-05 14:34:33
  • 解读classpath读取resources目录下的文件

    2023-01-25 05:49:36
  • SpringBoot参数校验与国际化使用教程

    2021-11-13 15:52:21
  • Java源码解析LinkedList

    2023-04-28 02:56:18
  • 详解Java实现多线程的三种方式

    2021-10-30 03:19:16
  • 如何解决Java多线程死锁问题

    2022-08-11 15:51:02
  • C#加密知识整合 (AES,MD5,RSA,SHA256)

    2023-07-19 09:09:13
  • 深入理解C#窗体关闭事件

    2023-06-01 14:38:56
  • Java servlet、filter、listener、interceptor之间的区别和联系

    2023-11-02 15:32:17
  • SpringBoot中的multipartResolver上传文件配置

    2022-01-22 11:06:51
  • Android Studio中统一管理版本号引用配置问题

    2023-03-06 04:23:54
  • Android仿Keep运动休息倒计时圆形控件

    2022-08-02 07:54:36
  • 浅析Spring和MyBatis整合及逆向工程

    2022-07-09 08:27:11
  • MyBatis-Plus实现逻辑删除的示例代码

    2022-05-14 06:12:35
  • java servlet手机app访问接口(三)高德地图云存储及检索

    2022-08-14 10:15:49
  • Java贪吃蛇游戏完善版

    2023-04-12 03:07:53
  • C#反射调用dll文件中的方法操作泛型与属性字段

    2022-09-15 03:24:04
  • android gradle如何修改生成的apk名字

    2023-03-09 23:38:56
  • 详解SpringBoot项目整合Vue做一个完整的用户注册功能

    2022-02-13 21:46:35
  • Springboot处理配置CORS跨域请求时碰到的坑

    2023-12-20 11:40:45
  • asp之家 软件编程 m.aspxhome.com