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

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和/或编译器.


该帖子已被改写为一篇文章在这里.

  • 这将为您提供表示`A.class`对象的类的`Class`对象,该对象又是`java.lang.Class`的一个实例. (4认同)
  • 怎么样`A.class.getClass()`? (2认同)

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.


Roh*_*han 7

使用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)


Mas*_*uso 6

看看下面的例子

a.getClass()!= A.class,即a不是A的实例,而是A的匿名子类

a.getClass() 需要类型A的实例