Em Java, quais prós / contras existem em torno da escolha de usar a.getClass()
ou A.class
? Qualquer um pode ser usado sempre que um Class<?>
for esperado, mas imagino que haveria desempenho ou outros benefícios sutis em usar ambos em circunstâncias diferentes (assim como há com Class.forName()
e ClassLoader.loadClass()
.
fonte
A.class.getClass()
?Class
objeto da classe que representa oA.class
objeto que é novamente uma instância dejava.lang.Class
.A.getClass().class
?A
for uma aula. Não hágetClass
método estático nas classes.Na verdade, eles são diferentes com relação a onde você pode usá-los.
A.class
funciona em tempo de compilação, enquantoa.getClass()
requer uma instância do tipoA
e funciona em tempo de execução.Pode haver uma diferença de desempenho também. Enquanto
A.class
pode ser resolvido pelo compilador porque ele conhece o tipo real deA
,a.getClass()
é uma chamada de método virtual acontecendo em tempo de execução.Para referência, um bytecode direcionado ao compilador normalmente emite as seguintes instruções para
Integer.getClass()
:e o seguinte para
Integer.class
:O primeiro normalmente envolveria um despacho de método virtual e, portanto, presumivelmente levaria mais tempo para executar. No entanto, isso é no final dependente da JVM.
fonte
dê uma olhada nos exemplos abaixo
a.getClass()!= A.class
, ou seja, a não é uma instância de A, mas de uma subclasse anônima de Aa.getClass()
requer uma instância do tipo Afonte
Use
a.getClass
quando você tiver uma instância de classe / tipo e quiser obter o tipo exato dela. whilea.class
é usado quando você temtype
disponível e deseja criar uma instância dele.Também
getClass()
retorna o tipo de instância em tempo de execução enquanto.class
é avaliado em tempo de compilação.Considerando o desempenho de
getClass()
e.class
,.class
tem um desempenho melhor do quegetClass()
.Exemplo:
Resultado :
fonte
Há uma diferença que gostaria de acrescentar. Digamos que você tenha uma classe um construtor conforme mostrado abaixo com uma superclasse que recebe um objeto Class. Você deseja que sempre que um objeto de subclasse for criado, o objeto de classe da subClasse seja passado para a superclasse. O código abaixo não será compilado, pois você não pode chamar um método de instância em um construtor. Nesse caso, se você substituir
myObject.getClass()
porMyClass.class
. Ele funcionará perfeitamente.fonte
Curiosamente, as diferenças de desempenho mencionadas no exemplo acima parecem estar relacionadas a outros motivos. Usando 3 classes diferentes, em média, o desempenho será quase o mesmo:
A saída será algo como:
E mudar a ordem das chamadas também resultará em
getClass()
ser mais rápido.Resultado:
fonte
p.getClass()
, ondep
é uma instância de um objeto, retorna a classe de tempo de execução desse objetop
.p
não pode ser um tipo que causará um erro em tempo de compilação, deve ser uma instância de um objeto.p.class
é uma expressão. O.class
é chamado de sintaxe de classe.p
é um tipo. Pode ser o nome de uma classe, interface ou array e até mesmo um tipo primitivo.a.getClass() == B.class
.Se um tipo estiver disponível e houver uma instância, é possível usar o
getClass
método para obter o nome do tipo. Caso contrário, use a.class
sintaxefonte