원시 필드의 유형을 점검하십시오
-
19-09-2019 - |
문제
객체의 필드 유형을 결정하려고합니다. 객체가 나에게 전달 될 때 물체의 유형을 모르지만 필드를 찾아야합니다. long
에스. 박스를 구별하는 것은 쉽습니다 Long
그러나 원시 long
더 어려워 보입니다.
나 ~할 수 있다 나에게 전달 된 물체가 Longs
, 프리미티브는 아니지만 오히려 그렇지 않습니다. 그래서 내가 가진 것은 다음과 같습니다.
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class)) {
// found one -- I don't get here for primitive longs
}
}
작동하는 것처럼 보이는 해킹 방식은 다음과 같습니다.
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class) || clazz.getName().equals("long")) {
// found one
}
}
나는 이것을 가지고 있다면 더 깨끗한 방법을 원합니다. 더 나은 방법이 없다면, 나는 내가받는 물건만을 필요로한다고 생각합니다. Long
(아니다 long
) 더 나은 API가 될 것입니다.
어떤 아이디어?
해결책
잘못된 상수를 사용하여 긴 프리미티브를 확인하고 있습니다 - 사용 Long.TYPE
, 서로 원시 유형은 래퍼에 유사하게 이름이 지정된 것으로 찾을 수 있습니다. 예 : Byte.TYPE
, Character.TYPE
, 등.
다른 팁
o.getClass().getField("fieldName").getType().isPrimitive();
당신은 그냥 사용할 수 있습니다
boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class
반사를 사용하는 경우, 왜 신경 쓰는가, 왜이 점검을 수행합니까? Get/Set 메소드는 항상 객체를 사용하므로 필드가 원시 유형인지 알 필요가 없습니다 (원시 유형을 널 값으로 설정하지 않는 한).
실제로, 메소드 get ()의 경우 어떤 유형인지 알 필요가 없습니다. 넌 할 수있어
// any number type is fine.
Number n = field.get(object);
long l = n.longValue();
당신이 할 수있는 숫자 유형인지 확실하지 않은 경우
Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
Number n = (Number) o;
long l = n.longValue();
필드를 감지합니다
long
유형 사용long.class
또는Long.TYPE
.필드를 감지합니다
Long
유형 사용Long.class
.
예시:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
// to detect both Long and long types
if (Long.class.equals(clazz) || long.class.equals(clazz)) {
// found one
}
}
알아채다:
Long.TYPE
정적 상수 구성원이며 동일합니다 long.class
.
스 니펫 코드 양식 Long
수업
/** * The {@link Class} object that represents the primitive type {@code long}. */ @SuppressWarnings("unchecked") public static final Class<Long> TYPE = (Class<Long>) long[].class.getComponentType();
또한 확인하십시오 대답 ~을 위한 정수와 정수의 차이 의문