자바 : 클래스의 모든 변수 이름 가져 오기


92

클래스가 있고 모든 공용 필드 (메서드가 아님) 를 찾고 싶습니다 . 어떻게 할 수 있습니까?

감사!


Reflection API를 사용하여이 작업을 수행 할 수 있어야합니다 .
Crozin 2010 년

답변:


135
Field[] fields = YourClassName.class.getFields();

클래스의 모든 공용 변수 배열을 반환합니다.

getFields()전체 계급 상속권의 필드를 반환합니다. 필드를 해당 클래스에서만 정의하고 수퍼 클래스는 정의하지 않으려면을 사용 하고 다음 접근 방식으로 필드를 getDeclaredFields()필터링하십시오 .publicModifier

Modifier.isPublic(field.getModifiers());

YourClassName.class문자 실제로 형식의 개체를 나타냅니다 java.lang.Class. 더 흥미로운 반사 방법에 대한 문서를 확인하십시오.

Field위 의 클래스는 java.lang.reflect.Field입니다. 전체 java.lang.reflect패키지를 살펴볼 수 있습니다 .


2
그냥 메모-처음에는 내 대답에 잘못된 진술이 포함되어 있었지만 여러 번 찬성되었습니다. 더주의 깊게 읽어 보시기 바랍니다)
Bozho

1
@downvoter-실수는 이전에있었습니다. 지금 보시면 공유 해주세요.
Bozho

이 솔루션이 느린가요? 아니면 자유롭게 사용할 수 있습니까?
Dany Y

괜찮아. 그러나 그것을 남용하지 마십시오.
Bozho


15

필요에 따라 두 가지 중 하나를 사용할 수 있습니다.

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

요구 사항에 따라 위 목록의 공용 필드 만 필터링하려면 아래 코드를 사용하십시오.

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());

2

소수의 사용자가 언급했듯이 아래 코드는 주어진 클래스의 모든 필드를 찾는 데 도움이 될 수 있습니다.

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

그러나 더 흥미로운 접근 방식은 다음과 같습니다.

Jackson 라이브러리의 도움으로 String / integer / double 유형의 모든 클래스 속성과 Map 클래스의 각 값을 찾을 수있었습니다. ( 반사 API를 사용하지 않고! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.