2017-12-12 4 views
2

여러 클래스에서 사용하고자하는 다음과 같은 일반 함수가 있습니다. 문제는 헬퍼 클래스에서 이것을 호출하면 표시 여부 때문에 필드 객체를 얻을 수 없다는 것입니다.헬퍼 클래스의 필드에 Java 리플렉션

public <T> List<T> descendingServices(Class<T> cls) { 
    List<T> descendings = new ArrayList<>(); 

    for (Field field : EnvironmentServiceImpl.class.getDeclaredFields()) { 
    Object obj; 
    try { 
     obj = field.get(this); 
     if (cls.isInstance(obj)) { 
     T descending = (T) obj; 
     descendings.add(descending); 
     } 
    } catch (IllegalAccessException e) { 
    } 
    } 

    return descendings; 
} 

현장에서 setAccessible을 사용하지 않고 어떻게 든 해결할 수 있습니까?

+0

nope. 편집 : 새로운 객체를 얻은 것처럼 보이므로 다시 되돌릴 필요가 없습니다. –

+0

참조 : https://stackoverflow.com/questions/10638826/java-reflection-impact-of- 접근 가능한 유적 –

답변

1

먼저 리플렉션을 사용하지 않는 경우 필드에 액세스하는 방법을 고려해야합니다. 그런 다음 데이터에 액세스하는 방법을 파악한 후에 리플렉션 코드를 추가 할 수 있습니다.

public이 아니기 때문에 필드에 액세스 할 수없는 경우 필드를 선언 한 클래스는 자체에 대한 캡슐화를 제공하여 필드에 액세스하는 public 게터 메소드를 선언해야합니다.

필요한 경우 getter 메소드를 클래스에 추가하십시오. 그런 다음 getDeclaredFields 대신 ClassgetMethods 메서드를 호출하십시오. 처리하고 싶지 않은 다른 방법을 우회해야 할 수도 있습니다. Javadocs for getMethods 가입일

:

는 클래스 또는 인터페이스와 수퍼 클래스로부터 상속 된 것들과 선언 포함한이 Class 객체가 나타내는 클래스 또는 인터페이스의 모든 공용 방법을 반영 Method 객체 배열을 리턴 슈퍼 인터페이스.

관련 문제