调用MyClass.class和MyClass.getClass()之间有什么区别

时间:2010-03-18 06:44:18

标签: java reflection

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

4 个答案:

答案 0 :(得分:23)

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

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

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

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

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

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

  

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

这是一种语言关键字。

答案 1 :(得分:5)

.getClass()返回对象的运行时类,因此可以在更改变量类时对其进行修改

另一方面,

.class总是返回“类型”

的类常量

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

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

//c1==c2

答案 2 :(得分:4)

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) { ...}

可以实现相同的功能

答案 3 :(得分:1)

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