2011-12-13 7 views

답변

0

클래스 어댑터를 사용할 수 있습니다. 클래스 어댑터는 레거시 클래스에서 파생되며 내부적으로 보호 된 메서드를 호출 할 공용 인터페이스 메서드를 노출합니다. 클라이언트는 레거시 클래스를 내부적으로 호출 할 클래스 어댑터의 public 메서드를 호출합니다.

1

액세스해야하는 클래스의 일부가 protected 인 경우 상속을 통해 액세스 할 수 있습니다.
do에 보호 된 코드에 대한 액세스 권한이있는 클래스를 통해 보호 된 부분에 액세스 할 수도 있습니다.

아마도 사용할 수있는 디자인 패턴은 Proxy입니다. 이 경우 프록시는 관심있는 클래스에서 상속받을 수 있으며 관심있는 메소드를 로컬에서 사용할 수 있습니다.

그러나이 모든 작업을 수행하기 전에주의 깊게 고려해보십시오. 이 부분의 인터페이스는 공개 범위가 없습니다. 그들을 폭로하지 않는 것이 좋은 이유가있을 수 있습니다.

0

보호 된 메서드의 전체적인 점은 외부에서 액세스 할 수 없게 만들고 메서드를 보호하는 것이 디자인 패턴의 중요한 점입니다.

클래스의 캡슐화를 해제하려면 원하는 디자인 패턴이 없습니다. 더러운 반사 전화 만.

Field privateStringField = PrivateObject.class. 
     getDeclaredField("privateString"); 

privateStringField.setAccessible(true); 
String fieldValue = (String) privateStringField.get(privateObject); 

같은 일이뿐만 아니라 방법으로 수행 할 수 있습니다 :

2

다음 코드는 필드에 액세스하는 방법을 보여줍니다. 그러나 하나의 패턴으로 ReflectionAccessor.accessField(Class class, Object object, String fieldName)과 같은 정적 유틸리티 메소드로 패키징하는 것이 좋습니다.

+1

좋은 답변이지만 참고 문헌을 인용하고 싶을 수도 있습니다 ... http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html – Bryan

0

리플렉션보다 빠르지 만 똑같이 더럽다 (아니면 더 많이) : 레거시 클래스와 동일한 패키지에 클래스를 정의하십시오. 원하는 모든 공개 방법을 제공하십시오. 이러한 공용 메소드를 레거시 클래스의 보호 된 메소드에 위임하게하십시오.

타이핑 한 후 손을 씻어야한다고 생각합니다.

+0

"나는 내 손을 씻어야한다고 생각합니다. 그것을 타이핑. " 하하! –

관련 문제