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 la 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 à convertir Integer
en Long
:
Java.lang.ClassCastException: Java.lang.Integer cannot be cast to Java.lang.Long
Y a-t-il un meilleur moyen d'y parvenir?
J'utilise Java 1.6.
Non, vous ne pouvez pas convertir Integer
en Long
, même si vous pouvez convertir de int
en long
. Pour un individu valeur qui est connue pour être un nombre et que vous voulez obtenir la valeur longue, vous pouvez utiliser:
Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();
Pour les tableaux, ce sera plus compliqué ...
Simplement:
Integer i = 7;
Long l = new Long(i);
Integer i = 5; //example
Long l = Long.valueOf(i.longValue());
Cela évite la perte de performance de la conversion en chaîne. La méthode longValue()
dans Integer est simplement une conversion de la valeur int. La méthode Long.valueOf()
donne à la machine virtuelle une chance d'utiliser une valeur mise en cache.
Curieusement, j'ai trouvé que si vous analysez à partir d'une chaîne, cela fonctionne.
int i = 0;
Long l = Long.parseLong(String.valueOf(i));
int back = Integer.parseInt(String.valueOf(l));
Gagner.
Convertissez directement un entier en long en ajoutant 'L' à la fin d'Integer.
Long i = 1234L;
Conversion de entier en long Très très simple et de nombreuses façons de convertir cela
Exemple 1
new Long(your_integer);
Exemple 2
Long.valueOf(your_integer);
Exemple 3
Long a = 12345L;
Exemple 4
Si vous avez déjà saisi l'entier en tant qu'entier, vous pouvez le faire:
Integer y = 12;
long x = y.longValue();
((Number) intOrLongOrSomewhat).longValue()
Si l'entier n'est pas nul
Integer i;
Long long = Long.valueOf(i);
i
sera automatiquement converti en long
.
L'utilisation de valueOf
au lieu de new
permet la mise en cache de cette valeur (si petite) par le compilateur ou la machine virtuelle Java, ce qui permet un code plus rapide.
new Long(Integer.longValue());
ou
new Long(Integer.toString());
Si vous savez que l'entier n'est pas NULL, vous pouvez simplement faire ceci:
Integer intVal = 1;
Long longVal = (long) (int) intVal
Un analyseur syntaxique de variables int
au type long
est inclus dans la classe Integer
. Voici un exemple:
int n=10;
long n_long=Integer.toUnsignedLong(n);
Vous pouvez facilement utiliser cette fonction intégrée pour créer une méthode qui analyse de int
à long
:
public static long toLong(int i){
long l;
if (i<0){
l=-Integer.toUnsignedLong(Math.abs(i));
}
else{
l=Integer.toUnsignedLong(i);
}
return l;
}
C'est null-safe
Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();