リフレクションを使用してフィールドの値を取得する必要があります。そのため、フィールドのデータ型が何であるかが常にわからないことがあります。そのため、またコードの重複を避けるために、次のメソッドを作成しました。
@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;
}
そして、このメソッドを次のように使用します。
Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
または
Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);
問題は、Integer
をLong
にキャストできないように見えることです。
Java.lang.ClassCastException: Java.lang.Integer cannot be cast to Java.lang.Long
これを達成するためのより良い方法はありますか?
Java 1.6を使用しています。
いいえ、Integer
からLong
に変換できても、int
をlong
にキャストできません。 individual値が数値であることがわかっており、長い値を取得する場合は、次のように使用できます。
Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();
配列の場合、より複雑になります...
単に:
Integer i = 7;
Long l = new Long(i);
Integer i = 5; //example
Long l = Long.valueOf(i.longValue());
これにより、ストリングへの変換によるパフォーマンスの低下を回避できます。 IntegerのlongValue()
メソッドは、int値の単なるキャストです。 Long.valueOf()
メソッドは、vmにキャッシュされた値を使用する機会を与えます。
奇妙なことに、文字列から解析すると機能することがわかりました。
int i = 0;
Long l = Long.parseLong(String.valueOf(i));
int back = Integer.parseInt(String.valueOf(l));
勝つ。
整数の末尾に「L」を追加して、整数を直接longに変換します。
Long i = 1234L;
整数をLongに変換する非常にシンプルで、それを変換する多くの方法
例1
new Long(your_integer);
例2
Long.valueOf(your_integer);
例3
Long a = 12345L;
例4
すでに整数としてint型を入力している場合、これを行うことができます:
Integer y = 12;
long x = y.longValue();
整数がnullでない場合
Integer i;
Long long = Long.valueOf(i);
i
は、自動的にlong
に型キャストされます。
valueOf
の代わりにnew
を使用すると、コンパイラーまたはJVMがこの値(小さい場合)をキャッシュできるため、コードが高速になります。
((Number) intOrLongOrSomewhat).longValue()
整数がNULLではないことがわかっている場合は、これを簡単に行うことができます。
Integer intVal = 1;
Long longVal = (long) (int) intVal
new Long(Integer.longValue());
または
new Long(Integer.toString());
int
変数からlong
型へのパーサーは、Integer
クラスに含まれています。次に例を示します。
int n=10;
long n_long=Integer.toUnsignedLong(n);
この組み込み関数を簡単に使用して、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;
}
これはヌルセーフです
Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();