J'ai un Object[]
tableau et j'essaie de trouver ceux qui sont primitifs. J'ai essayé d'utiliser Class.isPrimitive()
, mais il semble que je fais quelque chose de mal:
int i = 3;
Object o = i;
System.out.println(o.getClass().getName() + ", " +
o.getClass().isPrimitive());
impressions java.lang.Integer, false
.
Y a-t-il une bonne façon ou une alternative?
java
reflection
drill3r
la source
la source
int.class.isPrimitive()
rendementstrue
;Integer.class.isPrimitive()
rendementsfalse
.Réponses:
Les types dans un
Object[]
ne seront jamais vraiment primitifs - car vous avez des références! Ici, le type dei
estint
alors que le type de l'objet référencé paro
estInteger
(dû à l'auto-boxing).Il semble que vous ayez besoin de savoir si le type est un "wrapper pour primitive". Je ne pense pas qu'il y ait quoi que ce soit intégré dans les bibliothèques standard pour cela, mais c'est facile à coder:
la source
java.lang.<type>.TYPE
qu'après tout, ce qui est bien sûr le primitif lui-même. Il semble que je ne pourrai pas éviter de vérifier chaque type individuellement, merci pour la bonne solution.HashSet
permet l'accès en O (1) alors qu'une ligne d'if
instructions ou uneswitch
instruction nécessite O (# de wrappers) dans le pire des cas. En pratique, il est douteux que lesif
instructions pour le nombre fixe de 9 wrappers ne soient peut-être pas plus rapides que l'accès basé sur le hachage après tout.commons-lang
ClassUtils
a des méthodes pertinentes .La nouvelle version a:
Les anciennes versions ont la
wrapperToPrimitive(clazz)
méthode, qui retournera la correspondance primitive .la source
La bibliothèque goyave de Google dispose d' un utilitaire Primitives qui contrôle si une classe est un type d'emballage pour une primitive:
Primitives.isWrapperType(class)
.Class.isPrimitive () fonctionne pour les primitives
la source
Pour ceux qui aiment le code laconique.
la source
void.class.isPrimitive()
renvoie vraiVoid
estnull
;) il est utile pour créer unCallable<Void>
qui est un Callable qui ne renvoie rien.À partir de Java 1.5 et plus, il existe une nouvelle fonctionnalité appelée auto-boxing. Le compilateur le fait lui-même. Lorsqu'il voit une opportunité, il convertit un type primitif en sa classe wrapper appropriée.
Ce qui se passe probablement ici, c'est lorsque vous déclarez
Le compilateur compilera cette déclaration comme disant
C'est de la boxe automatique. Cela expliquerait la sortie que vous recevez. Cette page de la spécification Java 1.5 explique plus en détail l'auto-boxing.
la source
Integer.valueOf(int)
lui-même ne renvoie la valeur mise en cache que lorsque l'argument est "un octet" (lire: entre -128, 127, les deux inclus). Sinon, ça appellenew Integer(int)
. Voir: developer.classpath.org/doc/java/lang/… , hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/…Integer
n'est pas un primitif,Class.isPrimitive()
ne ment pas.la source
Je pense que cela est dû à la boxe automatique .
Vous pouvez implémenter une méthode utilitaire qui correspond à ces classes de boxe spécifiques et vous indique si une certaine classe est primitive.
la source
.equals
à==
. Les classes sont des singletons.Vous devez gérer l'auto-boxing de java.
Vous obtenez la classe test.class et javap -c test vous permet d'inspecter le bytecode généré. Comme vous pouvez le voir, le compilateur java ajouté pour créer un nouvel entier à partir de votre int, puis stocke ce nouvel objet dans o via astore_2Prenons le code
la source
la source
Juste pour que vous puissiez voir qu'il est possible pour isPrimitive de retourner true (puisque vous avez suffisamment de réponses vous montrant pourquoi il est faux):
Ceci est important dans la réflexion lorsqu'une méthode prend "int" plutôt qu'un "Integer".
Ce code fonctionne:
Ce code échoue (impossible de trouver la méthode):
la source
Comme plusieurs personnes l'ont déjà dit, cela est dû à l' auto-boxe .
Vous pouvez créer une méthode utilitaire pour vérifier si la classe de l'objet est
Integer
,Double
etc. Mais il n'y a aucun moyen de savoir si un objet a été créé par autoboxing d'une primitive ; une fois qu'il est encadré, il ressemble à un objet créé explicitement.Donc, à moins que vous ne sachiez avec certitude que votre tableau ne contiendra jamais de classe wrapper sans autoboxing, il n'y a pas de vraie solution.
la source
Les types de wrapper primitve ne répondront pas à cette valeur. C'est pour la représentation de classe des primitives, bien que mis à part la réflexion, je ne peux pas penser à trop d'utilisations pour cela à la légère. Donc, par exemple
affiche «faux», mais
imprime "vrai"
la source
Je suis en retard au salon, mais si vous testez un champ, vous pouvez utiliser
getGenericType
:Les documents Oracle répertorient les 8 types primitifs.
la source
C'est le moyen le plus simple auquel je puisse penser. Les classes wrapper sont présentes uniquement dans
java.lang
package. Et à part les classes wrapper, aucune autre classe dansjava.lang
n'a de champ nomméTYPE
. Vous pouvez l'utiliser pour vérifier si une classe est une classe Wrapper ou non.la source
Obtenez BeanUtils de Spring http://static.springsource.org/spring/docs/3.0.x/javadoc-api/
La variante Apache (les beans communs) a probablement des fonctionnalités similaires.
la source
vous pouvez déterminer si un objet est de type wrapper en suivant des instructions:
et vous pouvez également déterminer un objet primitif en utilisant la méthode isPrimitive ()
la source
la source
Pour les utilisateurs de javapoet , il existe également cette méthode:
la source