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