Em java, int não é uma classe, por que int.class esse uso? qual é a diferença entre int.class e integer.class?

Em Java, "X.class" é a sintaxe para literais de classe. Quando X é o nome de uma classe ou interface, a expressão X.class é avaliada para o objeto Class que representa essa classe ou tipo de interface (que são tipos de referência).

Como também existem objetos Class para tipos primitivos (usados ​​em reflexão), por consistência, eles estenderam a sintaxe para que, para um tipo primitivo X, a expressão X.class também avalie o objeto Class que representa esse tipo primitivo. Observe que para todos os tipos primitivos, esse valor também está disponível como o campo estático "TYPE" da classe de wrapper correspondente. Portanto, int.class é equivalente a Integer.TYPE.

int.class e Integer.class são coisas completamente diferentes. Eles avaliam para dois objetos de classe diferentes, representando dois tipos muito diferentes. No entanto, de maneira confusa, (por motivos obscuros) em Genéricos, ambas as expressões são especificadas pelo idioma para ter o mesmo tipo de tempo de compilação, Classe .

int:

  • int.class é um tipo primitivo.
  • int.class.isPrimitive () retorna true.
  • int.class não possui campos, públicos ou privados, nem métodos.
  • um int é armazenado na memória como um valor numérico literal. Ele não pode ter valor nulo, porque nulo é um ponteiro de memória igual a 0 e 0 é um número literal.

Inteiro:

  • Integer.class é um tipo de objeto.
  • Integer.class.isPrimitive () retorna false.
  • Integer.class possui métodos detalhados na especificação de classe: Integer (Java Platform SE 7)
  • Um número inteiro é armazenado na memória como uma referência (ponteiro de memória) a um primitivo int. Pode ser nulo, se o valor do ponteiro for 0, o local reservado para nulo.

Existem muitos casos em que você precisa dos métodos de objeto e as versões anteriores do Java exigiam a conversão explícita entre eles. O boxe automático foi introduzido para automatizar esse processo, porque era um pesadelo para gerenciar. Na maioria das vezes, a caixa automática é transparente, mas existem algumas ressalvas.

por exemplo, tentar converter um número inteiro nulo para um int causará uma exceção de tempo de execução, porque não há valor a ser convertido.

Por exemplo, os genéricos também não podem usar tipos primitivos, quaisquer referências a tipos primitivos serão convertidas automaticamente. Isso não é exatamente o mesmo que o boxe automático, porque você está lidando com tipos em vez de instâncias, mas na prática é equivalente.

Esse comportamento pode levar ao equívoco ilustrado em outra resposta:

  1. Classe i1 = int.class; Classe i2 = Integer.class; i1 == i2

Parece que as duas classes são iguais, mas se você usar o Reflection para analisar os tipos de retorno desses dois métodos:

  1. int intValue (); Número inteiro inteiro ();

Você verá que eles são realmente dois tipos diferentes.