Pergunta

Eu estou tentando determinar o tipo de um campo em um objeto. Eu não sei o tipo do objeto quando ele é passado para mim, mas eu preciso encontrar campos que são longs. É fácil o suficiente para distinguir os Longs em caixa, mas o long primitiva parece mais difícil.

I pode se certificar de que os objetos passados ??para mim só tem Longs, não os primitivos, mas eu prefiro não. Então, o que eu tenho é:

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
    }
}

Uma maneira hacky, que parece trabalho, é o seguinte:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}

Eu realmente gostaria de uma maneira mais limpa de fazer isso se houver. Se não há melhor forma, então eu acho que exigir a objetos recebo apenas Long uso (não long) seria uma melhor API.

Todas as idéias?

Foi útil?

Solução

Você está usando a constante errado para verificar se há primitivos Long - uso Long.TYPE, outro tipo primitivo pode ser encontrado com uma constante de nome semelhante na embalagem. por exemplo:. Byte.TYPE, Character.TYPE, etc

Outras dicas

o.getClass().getField("fieldName").getType().isPrimitive();

Você pode simplesmente usar

boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class

Se você estiver usando reflexão, por que você se importa, por que essa verificação em tudo. Os métodos get / set sempre usar objetos para que você não precisa saber se o campo é um tipo primitivo (a menos que você tentar definir um tipo primitivo para o valor nulo.)

Na verdade, para o método get () você não precisa saber que tipo é. Você pode fazer

// any number type is fine.
Number n = field.get(object);
long l = n.longValue();

Se você não tem certeza se é um número do tipo que você pode fazer

Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
     Number n = (Number) o;
     long l = n.longValue();
  • Para detectar campos com tipo long uso long.class ou Long.TYPE.

  • Para detectar campos com tipo Long uso Long.class.

Exemplo:

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
    }
}

Aviso :

Long.TYPE é membro constante estático e é equivalente a long.class.

trecho forma de código Long Class

/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();

Também verifique se há resposta href="https://stackoverflow.com/a/10195452/1908296"> para Diferença entre Integer.class e Integer.TYPE questão

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top