Java中的a.getClass()和A.class有什么区别?

2022-08-31 09:36:48

在Java中,围绕使用或选择存在哪些优点/缺点?任何一种都可以在预期的任何地方使用,但我想在不同情况下使用两者都会有性能或其他微妙的好处(就像和一样)。a.getClass()A.classClass<?>Class.forName()ClassLoader.loadClass()


答案 1

我不会在利弊方面比较它们,因为它们有不同的目的,并且很少在两者之间做出“选择”。

  • a.getClass()返回 运行时类型 。也就是说,如果你有,那么将返回类。aA a = new B();a.getClass()B

  • A.class静态计算到类,并用于通常与反射相关的其他目的。A

在性能方面,可能存在可衡量的差异,但我不会对此说任何话,因为最终它依赖于JVM和/或编译器。


这篇文章已经重写为一篇文章在这里


答案 2

它们实际上在可以在哪里使用它们方面是不同的。 在编译时工作,同时需要类型的实例并在运行时工作。A.classa.getClass()A

也可能存在性能差异。虽然可以由编译器解析,因为它知道 的实际类型,但运行时是一个虚拟方法调用。A.classAa.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。