【问题标题】:Foo.class what does it do?Foo.class 它有什么作用?
【发布时间】:2011-12-09 01:10:20
【问题描述】:

我正在查看一些 Java 代码,其中有我经常看到的代码。

Foo.class

这是用来表示类的类型吗?是不是类似

Foo.GetType();
typeof(Foo);

在 C# 中?

它是用来做什么的?又是什么意思?

【问题讨论】:

  • 一些相关信息:System.Type 是 .Net 中的通用类型,并非特定于 C#。我不知道 JVM 中的 Class 类型是否相同(与 Java 语言本身相反)。
  • 很难找到这条来自 Java 的信息。我搜索了“c# 类对象”、“c# 对类的引用”和许多其他不知道这在 C# 中称为 Type 的术语 - 您将获得的唯一内容是 OOP 的教程和介绍。但是谢谢你的问题:-)

标签: c# java class types


【解决方案1】:

java 中有一个特殊的类叫做 Class 。它继承对象。它的实例代表了java运行时的类和接口,也代表了枚举、数组、原始Java类型(boolean、byte、char、short、int、long、float、double)和关键字void .当一个类被加载,或者JVM调用类加载器的defineClass()方法时,JVM会创建一个Class对象。

Java 允许我们以多种方式创建一个类的对应 Class 对象, .class 就是其中之一。 例如

Class c1 = String.class; 

【讨论】:

    【解决方案2】:

    是的,Java 中的 Foo.class 等同于 C# 中的 typeof(Foo)。有关类文字的更多信息,请参阅section 15.8.2 of the JLS

    与在引用上调用GetType() 相同,后者获取对象的执行时间类型。 Java 等价于 someReference.getClass()

    在 Java 代码中比在 C# 中更频繁地看到它的一个原因是与泛型有关。有类似的东西并不完全不寻常:

    public class Generic<T>
    {
        private final Class<T> clazz;
    
        public Generic(Class<T> clazz)
        {
            this.clazz = clazz;
        }
    }
    

    这允许在执行时访问该类以进行反射等。由于类型擦除,这仅在 Java 中是必需的,因此泛型类型的对象通常无法确定其类型参数执行时间。

    【讨论】:

    • 太棒了。我觉得他们称之为 clazz 有点好笑:)
    • @user177883:嗯,这是一个惯例。其他人可能使用不同的名称。只是因为class是关键字。
    • @user177883,那是因为class是保留关键字。
    • 是的,我知道这是一个保留关键字,但 _class 有什么问题。正如 Jon 所说,这应该是他们使用的约定。
    • @user177883: 下划线是_class 的问题 :) 在某些表示字段名称的约定中,因此您不能将其用作参数名称......而且我个人只是不喜欢下划线...
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2019-04-26
    • 2016-04-29
    • 2017-03-02
    • 2012-10-04
    • 1970-01-01
    • 2014-05-03
    • 2018-09-20
    相关资源
    最近更新 更多