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

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

감사!



답변

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패키지를 살펴볼 수 있습니다 .


답변

https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html 에는 메서드 및 생성자를 찾는 차트도 있습니다.

여기에 이미지 설명 입력


답변

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

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


답변

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

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


답변