반사를 사용하여 필드의 값을 얻어야합니다. 필드의 데이터 유형이 무엇인지 항상 확신하지 못하는 경우가 발생합니다. 이를 위해 일부 코드 중복을 피하기 위해 다음 방법을 만들었습니다.
@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
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());
이렇게하면 문자열로 변환하는 성능 저하를 방지 할 수 있습니다. longValue()
Integer 의 메서드는 int 값의 캐스트입니다. 이 Long.valueOf()
메서드는 vm에게 캐시 된 값을 사용할 수있는 기회를 제공합니다.
답변
이상하게도 문자열에서 구문 분석하면 작동한다는 것을 알았습니다.
int i = 0;
Long l = Long.parseLong(String.valueOf(i));
int back = Integer.parseInt(String.valueOf(l));
승리.
답변
정수를 Long으로 변환하기 매우 간단하고 여러 가지 방법으로
예제 1
new Long(your_integer);
예 2
Long.valueOf(your_integer);
예제 3
Long a = 12345L;
예제 4
Integer로 입력 된 int가 이미있는 경우 다음을 수행 할 수 있습니다.
Integer y = 12;
long x = y.longValue();
답변
Integer 끝에 ‘L’을 추가하여 정수를 long으로 직접 변환합니다.
Long i = 1234L;
답변
Integer가 null이 아닌 경우
Integer i;
Long long = Long.valueOf(i);
i
자동으로 long
.
valueOf
대신 사용 new
하면 컴파일러 또는 JVM에 의해이 값 (작은 경우)을 캐싱 할 수 있으므로 코드가 더 빨라집니다.