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

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

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

【问题讨论】:

  • 有趣的问题,也想了解更多。

标签: java metaclass


【解决方案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 类的实例用于表示类和接口的类型。构造函数是在类级别定义的,而不是在元类级别。

【讨论】:

  • 感谢您的回复。这是否意味着构造函数是一种添加到每个类的静态方法?
  • 不,它们既不是实例方法也不是静态方法——它们是构造函数,是一种不同的方法,其唯一目的是创建类的新实例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多