IAm*_*aja 97 java reflection class
在Java中,使用a.getClass()或选择的优缺点是什么A.class?要么可以在任何Class<?>预期的地方使用,但我想在不同的情况下使用它们会有性能或其他微妙的好处(就像有Class.forName()和ClassLoader.loadClass().
aio*_*obe 155
我不会在优点/缺点方面对它们进行比较,因为它们有不同的目的,而且两者之间很少有"选择".
a.getClass()返回运行时类型的a.即,如果你有,A a = new B();那么a.getClass()将返回B课程.
A.class静态地评估A该类,并用于通常与反射相关的其他目的.
在性能方面,可能存在可衡量的差异,但我不会对此做任何说明,因为最终它依赖于JVM和/或编译器.
该帖子已被改写为一篇文章在这里.
Tom*_*icz 32
它们实际上与您可以使用它们的方式不同.A.class在编译时工作,同时a.getClass()需要一个类型的实例A并在运行时工作.
也可能存在性能差异.虽然A.class可以由编译器解决,因为它知道实际的类型A,a.getClass()是在运行时发生的虚方法调用.
作为参考,针对字节码的编译器通常会发出以下指令Integer.getClass():
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
Run Code Online (Sandbox Code Playgroud)
和以下内容Integer.class:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
Run Code Online (Sandbox Code Playgroud)
前者通常涉及虚拟方法调度,因此可能需要更长的时间来执行.然而,这最终取决于JVM.
使用a.getClass时,你有类/类型的实例,你想获得它的确切类型。a.class当您有type可用的资源并且想要创建它的实例时使用while 。
还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");
}
}
Run Code Online (Sandbox Code Playgroud)
输出 :
time (getClass()) : 79410 ns
time (.class) : 8032 ns
Run Code Online (Sandbox Code Playgroud)