【发布时间】:2010-03-18 06:44:18
【问题描述】:
MyClass.class 和 MyClass.getClass() 似乎都返回 java.lang.Class。有细微的区别还是可以互换使用?另外,MyClass.class 是超类 Class 类的公共属性吗? (我知道这存在,但似乎在 javadocs 中找不到任何提及)
【问题讨论】:
标签: java reflection
MyClass.class 和 MyClass.getClass() 似乎都返回 java.lang.Class。有细微的区别还是可以互换使用?另外,MyClass.class 是超类 Class 类的公共属性吗? (我知道这存在,但似乎在 javadocs 中找不到任何提及)
【问题讨论】:
标签: java reflection
一个是实例方法,所以它返回特定对象的类,另一个是类常量(即在编译时已知)。
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 类的公共属性吗?
这是一个语言关键字。
【讨论】:
.getClass()返回对象的运行时类,所以当你改变变量的类时可以修改
另一方面,.class 总是返回“类型”的类常量
注意
如果运行时类恰好与 TYPE 类相同,则两者将相等。
示例:
Long x = new Long(2);
Class c1 = Long.class;
Class c2 = x.getClass();
//c1==c2
【讨论】:
Long 是一个类型,new Long(2) 是该类型的新对象
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) { ...} 可以实现相同的功能
【讨论】:
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
【讨论】: