문제

객체의 필드 유형을 결정하려고합니다. 객체가 나에게 전달 될 때 물체의 유형을 모르지만 필드를 찾아야합니다. 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();

또한 확인하십시오 대답 ~을 위한 정수와 정수의 차이 의문

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top