【问题标题】:What's the difference between calling MyClass.class and MyClass.getClass() [duplicate]调用 MyClass.class 和 MyClass.getClass() 有什么区别 [重复]
【发布时间】:2010-03-18 06:44:18
【问题描述】:

MyClass.classMyClass.getClass() 似乎都返回 java.lang.Class。有细微的区别还是可以互换使用?另外,MyClass.class 是超类 Class 类的公共属性吗? (我知道这存在,但似乎在 javadocs 中找不到任何提及)

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    一个是实例方法,所以它返回特定对象的类,另一个是类常量(即在编译时已知)。

     Class n = Number.class;
     Number o = 1;
     o.getClass() // returns Integer.class
     o = BigDecimal.ZERO;
     o.getClass();  // returns BigDecimal.class
    

    这两种情况都返回描述特定 Java 类的 Class 对象的实例。对于同一个类,它们返回同一个实例(每个类只有一个 Class 对象)。

    获取 Class 对象的第三种方法是

    Class n = Class.forName("java.lang.Number");
    

    请记住,接口也有 Class 对象(例如上面的 Number)。

    另外,MyClass.class 是超类 Class 类的公共属性吗?

    这是一个语言关键字。

    【讨论】:

    • “类常量”是什么意思?当您分配“Class n = Number.class;”时n 的值是多少?
    • n 被分配了一个类的实例,该对象描述了数字“类”(实际上是一个接口)。
    【解决方案2】:

    .getClass()返回对象的运行时类,所以当你改变变量的类时可以修改

    另一方面,.class 总是返回“类型”的类常量

    注意
    如果运行时类恰好与 TYPE 类相同,则两者将相等。 示例:

    Long x = new Long(2);
    Class c1 = Long.class;
    Class c2 = x.getClass();
    
    //c1==c2
    

    【讨论】:

    • 另一方面,".class 总是返回“Type”的类常量 -> 这是什么意思?
    • @Mocha Long 是一个类型,new Long(2) 是该类型的新对象
    【解决方案3】:

    MyClass 没有静态 getClass 方法,也就是说,您不能调用 MyClass.getClass(),而是需要调用 (new MyClass()).getClass() 才能使其工作。

    getClass() 将返回一个 MyClass.class 对象。所以换句话说, MyClass.class 是结果对象,而 getClass() 是一个方法。 getClass() 方法在您不知道对象的实际类的情况下很有用,例如:

    public void someMethod(Object o) { if(o.getClass().equals(Set.class)) { // The object is a set } else if(o.getClass().equals(List.class)) { // The object is a List } }

    请注意,上面的代码示例并不是最好的,我只是想展示如何使用它。使用if(o instanceof Set) { ...} 可以实现相同的功能

    【讨论】:

      【解决方案4】:
      What's the difference between calling MyClass.class and MyClass.getClass()
      

      首先,您的问题标题有点误导! .getClass() is a method defined in java.lang.Object 所以 java 中的任何对象都可以调用它,因为 .class 在类本身上被调用(如公共静态变量)。所以问题应该是(坚持java命名约定)

      What's the difference between calling MyClass.class and myClassObject.getClass()
      

      现在来看实际差异

      .getClass() 是 java.lang.Object 中的原生 java 方法。此方法将返回与调用它的对象的runtime class 对应的 java.lang.Class 对象。所以

          Test t = new TestSubClass();
          Class c2 = t.getClass();
          System.out.println(c2);
      

      将打印class TestSubClass

      其中 .class 将返回静态评估(在编译时已知)的类。它实际上是Class对象对应的引用类型指向实际对象。所以

          Test t = new TestSubClass();
          Class c2 = Test.class;
          System.out.println(c2);
      

      将打印class Test

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        • 2011-09-27
        • 2013-04-22
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        相关资源
        最近更新 更多