我需要使用反射来获取字段的值。碰巧我并不总是确定字段的数据类型是什么。为此,为了避免一些代码重复,我创建了以下方法:
@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 i = 7;
Long l = new Long(i);
否,即使可以从int
转换为long
,也不能将Integer
强制转换为Long
。对于已知为数字的单个值,并且您想要获得长值,可以使用:
Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();
对于数组来说,这将更加棘手。。。
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));
获胜。
如果Integer不是空
Integer i;
Long long = Long.valueOf(i);
CCD_ 9将被自动类型转换为CCD_。
使用valueOf
而不是new
可以让编译器或JVM缓存这个值(如果它很小(,从而产生更快的代码。
将Integer转换为Long非常简单以及多种转换方法
示例1
new Long(your_integer);
示例2
Long.valueOf(your_integer);
示例3
Long a = 12345L;
示例4
如果你已经把int类型化为Integer,你可以这样做:
Integer y = 12;
long x = y.longValue();
通过在integer的末尾添加'L',将整数直接转换为long。
Long i = 1234L;
((Number) intOrLongOrSomewhat).longValue()
如果您知道Integer不是NULL,您可以简单地执行以下操作:
Integer intVal = 1;
Long longVal = (long) (int) intVal
new Long(Integer.longValue());
或
new Long(Integer.toString());
如果您不知道数字的确切类别(整数、长和双,等等(,您可以转换为数字并从中获取长值:
Object num = new Integer(6);
Long longValue = ((Number) num).longValue();
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;
}
对于可为null的包装器实例,
Integer i;
Long l = Optional.ofNullable(i)
.map(Long::valueOf)
.orElse(null);
要将Integer转换为Long,只需强制转换整数值
Integer intValue = 23;
Long longValue = (long) intValue;
这是空安全
Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();
如果列表类型为Long,则在每个整数值的末尾添加L
List<Long> list = new ArrayList<Long>();
list = Arrays.asList(1L, 2L, 3L, 4L);
尝试通过Jackson 转换值
ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)