4 回答

TA贡献1872条经验 获得超3个赞
我不会在优点/缺点方面进行比较,因为它们具有不同的目的,并且很少在两者之间做出选择。
a.getClass()返回运行时类型的a。也就是说,如果你有A a = new B();那么a.getClass()将返回B类。
A.class静态地评估A该类,并用于通常与反射相关的其他目的。
在性能方面,可能会有可测量的差异,但是我不会在此赘述,因为最终它取决于JVM和/或编译器。

TA贡献1854条经验 获得超8个赞
实际上,它们在何处可以使用方面有所不同。A.class在编译时工作,而a.getClass()需要一个类型的实例,A并在运行时工作。
性能可能也会有所不同。虽然A.class可以由编译器解决,因为它知道的实际类型A,这a.getClass()是在运行时发生的虚拟方法调用。
作为参考,针对字节码的编译器通常针对以下问题发出以下指令Integer.getClass():
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
和以下内容Integer.class:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
前者通常会涉及虚拟方法的分派,因此大概需要更长的时间才能执行。最终这取决于JVM。

TA贡献1811条经验 获得超5个赞
使用a.getClass时,你有类/类型的实例,你想获得它的确切类型。while a.class在type可用并要创建实例时使用。在编译时求值时,
还getClass()返回实例的运行时类型.class。
考虑到性能getClass()和.class,.class具有比更好的性能 getClass() 。
范例:
public class PerfomanceClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
long time=System.nanoTime();
Class class1="String".getClass();
class1="String".getClass();
class1="String".getClass();
class1="String".getClass();
System.out.println("time (getClass()) :"+(System.nanoTime()-time)+" ns");
long time2=System.nanoTime();
Class class2=String.class;
class2=String.class;
class2=String.class;
class2=String.class;
System.out.println("time (.class):"+(System.nanoTime()-time2)+" ns");
}
}
输出:
time (getClass()) : 79410 ns
time (.class) : 8032 ns
添加回答
举报