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()
?Class
objeto de la clase que representa elA.class
objeto que es nuevamente una instancia dejava.lang.Class
.A.getClass().class
?A
es una clase. No hay ungetClass
método estático en las clases.En realidad, son diferentes con respecto a dónde puede usarlos.
A.class
funciona en tiempo de compilación, mientras quea.getClass()
requiere una instancia de tipoA
y funciona en tiempo de ejecución.También puede haber una diferencia de rendimiento. Si bien
A.class
el 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.getClass
cuando tenga una instancia de clase / tipo y desee obtener el tipo exacto. whilea.class
se usa cuando tienestype
disponible y quieres crear una instancia de él.También
getClass()
devuelve el tipo de instancia en tiempo de ejecución mientras.class
se evalúa en tiempo de compilación.Teniendo en cuenta el rendimiento de
getClass()
y.class
,.class
tiene 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()
, dondep
es una instancia de un objeto, devuelve la clase de tiempo de ejecución de este objetop
.p
no puede ser un tipo que cause un error en tiempo de compilación, debe ser una instancia de un objeto.p.class
es una expresion. Se.class
llama sintaxis de clase.p
es 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
getClass
método para obtener el nombre del tipo. De lo contrario, use la.class
sintaxisfuente