Recuperar apenas campos estáticos declarados na classe Java

163

Eu tenho a seguinte classe:

public class Test {
    public static int a = 0;
    public int b = 1;
}

É possível usar a reflexão para obter apenas uma lista dos campos estáticos? Estou ciente de que posso obter uma matriz de todos os campos com Test.class.getDeclaredFields(). Mas parece que não há como determinar se uma Fieldinstância representa um campo estático ou não.

Anders
fonte
Eu sou java mais recente, quero saber por que o Java não colocou esses recursos na classe Field, como C #. Qual é o benefício desse design? Obrigado.
22415 Allen

Respostas:

327

Você pode fazer assim:

Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        staticFields.add(field);
    }
}
Abhinav Sarkar
fonte
12

Eu me deparei com essa questão por acidente e senti que precisava de uma atualização do Java 8 usando fluxos:

public static List<Field> getStatics(Class<?> clazz) {
    List<Field> result;

    result = Arrays.stream(clazz.getDeclaredFields())
            // filter out the non-static fields
            .filter(f -> Modifier.isStatic(f.getModifiers()))
            // collect to list
            .collect(toList());

    return result;
}

Obviamente, essa amostra é um pouco embelezada para facilitar a leitura. Na verdade, você provavelmente escreveria assim:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}
Torque
fonte
4
"Na verdade, você provavelmente escreveria assim" ... por que você acha que "na realidade" essa legibilidade não é importante?
Michael Michael
2
Primeiro, não acho que zombar de alguém em inglês em um site como esse seja apropriado. Além disso, não acredito que os comentários no exemplo embelezado sirvam para melhorar a legibilidade de alguém que esteja familiarizado remotamente com fluxos, nem a variável de retorno inútil. Eu consideraria os dois ruídos se os encontrasse no código real. Com mais experiência com transmissões, hoje eu optaria por manter as novas linhas originais para facilitar a leitura. Ninguém é perfeito. O meu objetivo era fornecer um exemplo explícito para novos programadores e um realista.
Torque
3
Eu não estava zombando do seu inglês. O teu inglês é bom. Eu nem entendo do que você está falando. E sim, concordo que os comentários são supérfluos e que a formatação do primeiro é muito melhor. Meu argumento foi que você parecia sugerir que "embelezar a legibilidade" é ruim, quando a legibilidade é uma métrica de qualidade de código incrivelmente importante.
Michael Michael
0

Isso é simples, você pode usar o Modificador para verificar se um campo é estático ou não. Aqui está um código de amostra para esse tipo de tarefa.

public static void printModifiers(Object o) {
    Class c = o.getClass();
    int m = c.getModifiers();
    if (Modifier.isPublic(m))
        System.out.println ("public");
    if (Modifier.isAbstract(m))
        System.out.println ("abstract");
    if (Modifier.isFinal(m))
        System.out.println ("final");
    if(Modifier.isStatic(m))
        System.out.println("static");
}
Salman Saleh
fonte