En Java, ¿qué ventajas y desventajas existen en torno a la elección de utilizar a.getClass()o A.class? Cualquiera de los dos se puede usar donde Class<?>se espere a, pero imagino que habría rendimiento u otros beneficios sutiles al usar ambos en diferentes circunstancias (al igual que con Class.forName()y ClassLoader.loadClass().
fuente

A.class.getClass()?Classobjeto de la clase que representa elA.classobjeto que es nuevamente una instancia dejava.lang.Class.A.getClass().class?Aes una clase. No hay ungetClassmétodo estático en las clases.En realidad, son diferentes con respecto a dónde puede usarlos.
A.classfunciona en tiempo de compilación, mientras quea.getClass()requiere una instancia de tipoAy funciona en tiempo de ejecución.También puede haber una diferencia de rendimiento. Si bien
A.classel compilador puede resolverlo porque conoce el tipo real deA,a.getClass()hay una llamada a un método virtual en tiempo de ejecución.Como referencia, un código de bytes de destino del compilador normalmente emite las siguientes instrucciones para
Integer.getClass():y lo siguiente para
Integer.class:El primero normalmente implicaría un envío de método virtual y, por lo tanto, presumiblemente tardaría más en ejecutarse. Sin embargo, al final eso depende de la JVM.
fuente
echa un vistazo a los ejemplos a continuación
a.getClass()!= A.class, es decir, a no es una instancia de A sino de una subclase anónima de Aa.getClass()requiere una instancia de tipo Afuente
Úselo
a.getClasscuando tenga una instancia de clase / tipo y desee obtener el tipo exacto. whilea.classse usa cuando tienestypedisponible y quieres crear una instancia de él.También
getClass()devuelve el tipo de instancia en tiempo de ejecución mientras.classse evalúa en tiempo de compilación.Teniendo en cuenta el rendimiento de
getClass()y.class,.classtiene un mejor rendimiento quegetClass().Ejemplo:
Salida:
fuente
Hay una diferencia que me gustaría agregar. Digamos que tiene un constructor de clase a como se muestra a continuación con una superclase que toma un objeto Class. Desea que siempre que se cree un objeto de subclase, el objeto de clase de subclase se pase a la superclase. El siguiente código no se compilará ya que no puede llamar a un método de instancia en un constructor. En ese caso, si reemplaza
myObject.getClass()conMyClass.class. Funcionará perfectamente.fuente
Curiosamente, las diferencias de rendimiento mencionadas en el ejemplo anterior parecen estar relacionadas con otras razones. Usando 3 clases diferentes, en promedio, el rendimiento será casi el mismo:
La salida será algo como:
Y cambiar el orden de las llamadas incluso resultará en
getClass()ser más rápido.Salida:
fuente
p.getClass(), dondepes una instancia de un objeto, devuelve la clase de tiempo de ejecución de este objetop.pno puede ser un tipo que cause un error en tiempo de compilación, debe ser una instancia de un objeto.p.classes una expresion. Se.classllama sintaxis de clase.pes un tipo. Puede ser el nombre de una clase, interfaz o matriz e incluso un tipo primitivo.a.getClass() == B.class.Si un tipo está disponible y hay una instancia, entonces es posible usar el
getClassmétodo para obtener el nombre del tipo. De lo contrario, use la.classsintaxisfuente