Java 클래스에서 선언 된 정적 필드 만 검색


163

다음 수업이 있습니다.

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

정적 필드 목록 만 가져 오기 위해 리플렉션을 사용할 수 있습니까? 와 함께 모든 필드의 배열을 얻을 수 있다는 것을 알고 있습니다 Test.class.getDeclaredFields(). 그러나 Field인스턴스가 정적 필드를 나타내는 지 여부를 결정할 수있는 방법이없는 것 같습니다 .


Java가 더 최신입니다 .Java가 C #과 같은 Field 클래스에 이러한 기능을 모두 넣지 않은 이유를 알고 싶습니다.이 디자인의 이점은 무엇입니까? 감사.
Allen

답변:


327

다음과 같이 할 수 있습니다.

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

12

우연히이 질문을 우연히 발견했으며 스트림을 사용하여 Java 8 업데이트가 필요하다고 느꼈습니다.

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

분명히, 그 샘플은 가독성을 위해 약간 개선되었습니다. 실제로 다음과 같이 작성할 것입니다.

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}

4
"실제로, 당신은 이것을 이렇게 쓸 것입니다."... 왜 "실제로"가독성이 중요하지 않다고 생각합니까?
Michael

2
우선, 나는 이런 사이트에서 누군가 영어를 조롱하는 것이 적절하다고 생각하지 않습니다. 그 외에도, 장식 된 예제의 주석은 스트림에 원격으로 익숙한 사람에게 가독성을 향상시키는 데 도움이되지 않으며 쓸모없는 반환 변수도 있다고 생각하지 않습니다. 실제 코드에서 발생하면 두 노이즈를 모두 고려합니다. 내 벨트 아래의 스트림에 대한 더 많은 경험을 바탕으로 오늘은 가독성을 위해 원래 줄 바꿈을 유지하도록 선택했습니다. 누구도 완벽하지 않다. 나는 새로운 프로그래머에게 명백한 예와 사실적인 예를 제공하고자했다.
토크

3
나는 당신의 영어를 조롱하지 않았습니다. 너의 영어 실력은 좋아. 네가 무슨 말을하는지 이해조차 못해 그리고 네, 의견이 불필요하고 첫 번째 형식이 훨씬 낫다는 데 동의합니다. 내 요점은 가독성이 엄청나게 중요한 코드 품질 척도 인 경우 "가독성 향상"이 나쁘다는 것을 제안하는 것 같았다.
Michael


0

간단합니다. 수정자를 사용하여 필드가 정적인지 여부를 확인할 수 있습니다. 이러한 종류의 작업에 대한 샘플 코드는 다음과 같습니다.

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");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.