Java中的a.getClass()和A.class有什么区别?
2022-08-31 09:36:48
在Java中,围绕使用或选择存在哪些优点/缺点?任何一种都可以在预期的任何地方使用,但我想在不同情况下使用两者都会有性能或其他微妙的好处(就像和一样)。a.getClass()
A.class
Class<?>
Class.forName()
ClassLoader.loadClass()
在Java中,围绕使用或选择存在哪些优点/缺点?任何一种都可以在预期的任何地方使用,但我想在不同情况下使用两者都会有性能或其他微妙的好处(就像和一样)。a.getClass()
A.class
Class<?>
Class.forName()
ClassLoader.loadClass()
我不会在利弊方面比较它们,因为它们有不同的目的,并且很少在两者之间做出“选择”。
a.getClass()
返回 运行时类型 。也就是说,如果你有,那么将返回类。a
A a = new B();
a.getClass()
B
A.class
静态计算到类,并用于通常与反射相关的其他目的。A
在性能方面,可能存在可衡量的差异,但我不会对此说任何话,因为最终它依赖于JVM和/或编译器。
这篇文章已经重写为一篇文章在这里。
它们实际上在可以在哪里使用它们方面是不同的。 在编译时工作,同时需要类型的实例并在运行时工作。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。