J'ai besoin d'obtenir la valeur d'un champ en utilisant la réflexion. Il se trouve que je ne suis pas toujours sûr du type de données du champ. Pour cela, et pour éviter une duplication de code, j'ai créé la méthode suivante:
@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
Field f = classUnderTest.getDeclaredField(processFieldName(var));
f.setAccessible(true);
T value = (T) f.get(runtimeInstance);
return value;
}
Et utilisez cette méthode comme:
Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
ou
Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);
Le problème est que je n'arrive pas à lancer un casting Integer
vers Long
:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
Y a-t-il une meilleure façon d'y parvenir?
J'utilise Java 1.6.
java
reflection
casting
Tiago Veloso
la source
la source
Number[]
et une boucle dessus pour créer un tableau correctement typé, non?double[]
par exemple, mais cela fonctionne pour unDouble[]
.Number
. Ou pour le dire autrement: quelle règle de conversion pensez-vous vous permet de passer de l'une à l'autre?Simplement:
la source
int
valeurs.Integer
toint
, puis le convertit enlong
avant de passer auLong(long)
constructeur maintenant obsolète .Cela évite l'atteinte des performances de la conversion en chaîne. La
longValue()
méthode Integer est juste une conversion de la valeur int. LaLong.valueOf()
méthode donne au vm une chance d'utiliser une valeur mise en cache.la source
Curieusement, j'ai trouvé que si vous analysez à partir d'une chaîne, cela fonctionne.
Gagner.
la source
Conversion d'un entier en long très simple et de nombreuses façons de convertir cet
exemple 1
Exemple 2
Exemple 3
Exemple 4
Si vous avez déjà tapé int comme un entier, vous pouvez le faire:
la source
Convertissez directement un entier en long en ajoutant «L» à la fin de Integer.
la source
Si l'entier n'est pas nul
i
sera automatiquement converti en fichierlong
.L'utilisation
valueOf
au lieu denew
permet la mise en cache de cette valeur (si elle est petite) par le compilateur ou la JVM, ce qui permet un code plus rapide.la source
la source
Si vous savez que l'Integer n'est pas NULL, vous pouvez simplement faire ceci:
la source
ou
la source
Un analyseur de
int
variables aulong
type est inclus dans laInteger
classe. Voici un exemple:Vous pouvez facilement utiliser cette fonction intégrée pour créer une méthode qui analyse de
int
àlong
:la source
C'est null-safe
la source
Si vous ne connaissez pas la classe exacte de votre nombre ( Integer , Long , Double , peu importe), vous pouvez convertir en Number et en tirer votre valeur longue:
la source
Dans le cas d'une Liste de type Long, Ajout de L à la fin de chaque valeur Integer
la source
Essayez de convertirValue par Jackson
la source