Eu tenho um Object[]
array e estou tentando encontrar aqueles que são primitivos. Tentei usar Class.isPrimitive()
, mas parece que estou fazendo algo errado:
int i = 3;
Object o = i;
System.out.println(o.getClass().getName() + ", " +
o.getClass().isPrimitive());
impressões java.lang.Integer, false
.
Existe um caminho certo ou alguma alternativa?
java
reflection
drill3r
fonte
fonte
int.class.isPrimitive()
rendimentostrue
;Integer.class.isPrimitive()
rendimentosfalse
.Respostas:
Os tipos em um
Object[]
nunca serão realmente primitivos - porque você tem referências! Aqui, o tipo dei
é,int
enquanto o tipo do objeto referenciado poro
éInteger
(devido ao auto-boxing).Parece que você precisa descobrir se o tipo é um "invólucro para primitivo". Não acho que haja algo integrado nas bibliotecas padrão para isso, mas é fácil de codificar:
fonte
java.lang.<type>.TYPE
depois de tudo, que é claro o próprio primitivo. Parece que não vou conseguir evitar a verificação de cada tipo individualmente, obrigado pela boa solução.HashSet
permite o acesso em O (1) enquanto uma linha deif
instruções ouswitch
instruções requer O (número de invólucros) no pior caso. Na prática, é questionável se asif
instruções para o número fixo de 9 wrappers talvez não sejam mais rápidas do que o acesso baseado em hash.commons-lang
ClassUtils
tem métodos relevantes .A nova versão possui:
As versões antigas possuem
wrapperToPrimitive(clazz)
método, que retornará a correspondência primitiva .fonte
A biblioteca Guava do Google tem um utilitário Primitives que verifica se uma classe é um tipo de wrapper para um primitivo:
Primitives.isWrapperType(class)
.Class.isPrimitive () funciona para primitivos
fonte
Para quem gosta de código conciso.
fonte
void.class.isPrimitive()
retorna verdadeiroVoid
énull
;) é útil para criar umCallable<Void>
que é um Callable que não retorna nada.A partir do Java 1.5 e superior, há um novo recurso chamado caixa automática. O compilador faz isso sozinho. Quando ele vê uma oportunidade, ele converte um tipo primitivo em sua classe de invólucro apropriada.
O que provavelmente está acontecendo aqui é quando você declara
O compilador irá compilar esta declaração dizendo
Isso é boxe automático. Isso explicaria a saída que você está recebendo. Esta página da especificação Java 1.5 explica a boxing automática com mais detalhes.
fonte
Integer.valueOf(int)
próprio @SteveKuo só retorna o valor em cache quando o argumento é "um byte" (leia-se: entre -128, 127, ambos inclusive). Caso contrário, ele chamanew Integer(int)
. Ver: developer.classpath.org/doc/java/lang/… , hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/…Integer
não é um primitivo,Class.isPrimitive()
não está mentindo.fonte
Acho que isso acontece devido ao auto-boxing .
Você pode implementar um método utilitário que corresponda a essas classes específicas de boxe e forneça se uma determinada classe é primitiva.
fonte
.equals
com segurança para==
. As aulas são solteiros.Você tem que lidar com o auto-boxing de java.
Você obtém a classe test.class e javap -c test para inspecionar o bytecode gerado. Como você pode ver, o compilador java adicionado para criar um novo inteiro a partir de seu int e, em seguida, armazena esse novo objeto em o via astore_2Vamos pegar o código
fonte
fonte
Para que você possa ver que é possível que isPrimitive retorne verdadeiro (já que você tem respostas suficientes mostrando por que é falso):
Isso é importante na reflexão quando um método aceita "int" em vez de um "Inteiro".
Este código funciona:
Este código falha (não é possível encontrar o método):
fonte
Como várias pessoas já disseram, isso se deve ao autoboxing .
Você poderia criar um método utilitário para verificar se a classe do objeto é
Integer
,Double
etc. Mas não há como saber se um objeto foi criado por autoboxing de um primitivo ; depois de embalado, ele se parece com um objeto criado explicitamente.Portanto, a menos que você tenha certeza de que seu array nunca conterá uma classe de wrapper sem autoboxing, não há solução real.
fonte
Os tipos de wrapper primitivos não responderão a este valor. Isso é para representação de classe de primitivos, embora, além da reflexão, eu não possa pensar em muitos usos para isso de improviso. Então, por exemplo
imprime "falso", mas
imprime "verdadeiro"
fonte
Estou atrasado para o show, mas se você estiver testando um campo, pode usar
getGenericType
:Os documentos do Oracle listam os 8 tipos primitivos.
fonte
Esta é a maneira mais simples que eu poderia imaginar. As classes de wrapper estão presentes apenas no
java.lang
pacote. E além das classes de wrapper, nenhuma outra classejava.lang
possui um campo nomeadoTYPE
. Você pode usar isso para verificar se uma classe é classe Wrapper ou não.fonte
Obtenha o BeanUtils do Spring http://static.springsource.org/spring/docs/3.0.x/javadoc-api/
Provavelmente, a variação do Apache (beans comuns) tem funcionalidade semelhante.
fonte
você pode determinar se um objeto é do tipo wrapper por meio das instruções abaixo:
e você também pode determinar um objeto primitivo usando o método isPrimitive ()
fonte
fonte
Para os usuários do javapoet , também existe esta maneira:
fonte