클래스가 있고 모든 공용 필드 (메서드가 아님) 를 찾고 싶습니다 . 어떻게 할 수 있습니까?
감사!
답변:
Field[] fields = YourClassName.class.getFields();
클래스의 모든 공용 변수 배열을 반환합니다.
getFields()
전체 계급 상속권의 필드를 반환합니다. 필드를 해당 클래스에서만 정의하고 수퍼 클래스는 정의하지 않으려면을 사용 하고 다음 접근 방식으로 필드를 getDeclaredFields()
필터링하십시오 .public
Modifier
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());
}
}