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
本身当然也是一个类——因此也存在一个描述类Class
的Class
的实例。我认为这就是事情以某种方式递归的地方。
总结:只有一个元类:java.lang.Class
。元类的多个实例(元实例?)描述了各个类——包括元类本身。构造函数描述是元类实例的一部分。
【讨论】:
我明白了,谢谢。这是否意味着每次我使用“新字符串”时,它都会创建两个实例:一个 java.lang.String 和一个 java.lang.Class? 不,因为对于String
的每个实例,String
的Class
实例只是被重用。它不能在 String
的多个实例之间改变或不同。那么为什么要复制 anything 呢?
@Shmoopy 仅在您第一次引用字符串时。每个类只创建一个 Class 对象(因此为所有字符串创建一个)【参考方案2】:
在 Java 中只有一个元类:Class
类的实例用于表示类和接口的类型。构造函数是在类级别定义的,而不是在元类级别。
【讨论】:
感谢您的回复。这是否意味着构造函数是一种添加到每个类的静态方法? 不,它们既不是实例方法也不是静态方法——它们是构造函数,是一种不同的方法,其唯一目的是创建类的新实例以上是关于Java 实现 - 元类的主要内容,如果未能解决你的问题,请参考以下文章