Java 实现 - 元类

Posted

技术标签:

【中文标题】Java 实现 - 元类【英文标题】:Java implementation - Meta classes 【发布时间】:2012-03-09 19:00:03 【问题描述】:

按照我的理解,Java 对象模型是 3 个级别,每个级别描述它下面的级别,因此所有 Classes 共享一个 Meta 类(它们本身是对象?)。

我的问题是 - Java 中的构造函数是如何实现的? (或任何其他类方法)我的逻辑说构造函数应该出现在 Meta 类中,但是由于只有一个 Meta 类,所以保留所有可能的构造函数没有任何意义,或者我对此的理解就是全部错了。。

【问题讨论】:

有趣的问题,也想了解更多。 【参考方案1】:

您的问题针对构造函数没有什么特别之处:从在元级别上描述类的角度来看,构造函数、“普通方法”和字段具有相同的概念。

所以这样想:

Java 中的每个类都由一组信息描述:

类名 超类 实现的接口 构造函数列表及其签名 (静态和非静态)方法及其签名列表 (静态和非静态)字段及其类型的列表

为方便起见,您可以在运行时使用此信息 - 这是“反射 API”。

由于 JVM 加载的每个类都可以使用相同类型的信息,因此将其捆绑在一个名为 java.lang.Class 的自己的类中。

所以Class 类的一个实例 描述了java.lang.String 类,Class 的另一个实例 描述了my.own.class.Foo

java.lang.Class 本身当然也是一个类——因此也存在一个描述类ClassClass实例。我认为这就是事情以某种方式递归的地方。

总结:只有一个元类:java.lang.Class。元类的多个实例(元实例?)描述了各个类——包括元类本身。构造函数描述是元类实例的一部分。

【讨论】:

我明白了,谢谢。这是否意味着每次我使用“新字符串”时,它都会创建两个实例:一个 java.lang.String 和一个 java.lang.Class? 不,因为对于String 的每个实例,StringClass 实例只是被重用。它不能在 String 的多个实例之间改变或不同。那么为什么要复制 anything 呢? @Shmoopy 仅在您第一次引用字符串时。每个类只创建一个 Class 对象(因此为所有字符串创建一个)【参考方案2】:

在 Java 中只有一个元类:Class 类的实例用于表示类和接口的类型。构造函数是在类级别定义的,而不是在元类级别。

【讨论】:

感谢您的回复。这是否意味着构造函数是一种添加到每个类的静态方法? 不,它们既不是实例方法也不是静态方法——它们是构造函数,是一种不同的方法,其唯一目的是创建类的新实例

以上是关于Java 实现 - 元类的主要内容,如果未能解决你的问题,请参考以下文章

1104课堂小结

096 元类

面向对象之元类

面向对象-元类

python 吐血总结面向对象元类

python 吐血总结面向对象元类