인터페이스의 일부가 보호되는 클래스가 있지만 패키지 밖에서 계층 구조 밖에서 사용하고 싶다면 어떤 패턴을 사용할 수 있습니까?
이전 (레거시) 클래스의 액세스 한정자를 변경하고 싶지 않습니다.패턴을 통해 비공개 메소드에 액세스하기
답변
클래스 어댑터를 사용할 수 있습니다. 클래스 어댑터는 레거시 클래스에서 파생되며 내부적으로 보호 된 메서드를 호출 할 공용 인터페이스 메서드를 노출합니다. 클라이언트는 레거시 클래스를 내부적으로 호출 할 클래스 어댑터의 public 메서드를 호출합니다.
액세스해야하는 클래스의 일부가 protected
인 경우 상속을 통해 액세스 할 수 있습니다.
do에 보호 된 코드에 대한 액세스 권한이있는 클래스를 통해 보호 된 부분에 액세스 할 수도 있습니다.
아마도 사용할 수있는 디자인 패턴은 Proxy입니다. 이 경우 프록시는 관심있는 클래스에서 상속받을 수 있으며 관심있는 메소드를 로컬에서 사용할 수 있습니다.
그러나이 모든 작업을 수행하기 전에주의 깊게 고려해보십시오. 이 부분의 인터페이스는 공개 범위가 없습니다. 그들을 폭로하지 않는 것이 좋은 이유가있을 수 있습니다.
보호 된 메서드의 전체적인 점은 외부에서 액세스 할 수 없게 만들고 메서드를 보호하는 것이 디자인 패턴의 중요한 점입니다.
클래스의 캡슐화를 해제하려면 원하는 디자인 패턴이 없습니다. 더러운 반사 전화 만.
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
같은 일이뿐만 아니라 방법으로 수행 할 수 있습니다 :
는다음 코드는 필드에 액세스하는 방법을 보여줍니다. 그러나 하나의 패턴으로 ReflectionAccessor.accessField(Class class, Object object, String fieldName)
과 같은 정적 유틸리티 메소드로 패키징하는 것이 좋습니다.
리플렉션보다 빠르지 만 똑같이 더럽다 (아니면 더 많이) : 레거시 클래스와 동일한 패키지에 클래스를 정의하십시오. 원하는 모든 공개 방법을 제공하십시오. 이러한 공용 메소드를 레거시 클래스의 보호 된 메소드에 위임하게하십시오.
타이핑 한 후 손을 씻어야한다고 생각합니다.
"나는 내 손을 씻어야한다고 생각합니다. 그것을 타이핑. " 하하! –
- 1. 비공개 필드에 액세스하기
- 2. popViewController에서 pushViewController 메소드에 액세스하기
- 3. PHP의 부모 메소드에 액세스하기
- 4. 체인의 이전 메소드에 액세스하기 (Ruby on Rails)
- 5. 인스턴스 메소드와 같은 클래스 메소드에 액세스하기
- 6. 안드로이드에서 IntentReceiver로부터 바운드 서비스의 메소드에 액세스하기
- 7. 루프 내에서 Backbone.js 뷰에있는 메소드에 액세스하기
- 8. FragmentManager를 사용하여 액티비티의 프래그먼트 메소드에 액세스하기
- 9. PhaseListener를 통해 컨트롤러에 액세스하기
- 10. android를 통해 프린터에 액세스하기
- 11. jquery를 통해 객체에 액세스하기
- 12. 활동을 통해 서비스 메소드에 액세스
- 13. JNDI 클라이언트를 통해 엔터프라이즈 리소스에 액세스하기
- 14. 브라우저를 통해 PHP로 DBus에 액세스하기
- 15. 화이트를 통해 DataGridView 셀에 액세스하기
- 16. 리플렉션을 통해 내부 클래스에 액세스하기
- 17. Flip View error - 알 수없는 getter 메소드에 액세스하기
- 18. 공용 API를 통해 비공개 형식 내보내기
- 19. SoundCloud API를 통해 비공개 트랙을 즐겨 찾기
- 20. 필드에 액세스하기
- 21. 변수를 통해 어떤 메소드에 전달 된 변수는
- 22. HTTP를 통해 임베디드 Solr 인스턴스에 액세스하기
- 23. 자바 스크립트를 통해 Facebook 그래프에 액세스하기
- 24. iphone을 통해 mysql password() 해시에 액세스하기
- 25. getters-setters를 통해 C++에서 속성에 액세스하기
- 26. 응용 프로그램을 통해 apk 파일에 액세스하기
- 27. 뷰를 통해 다른 컨트롤러에서 변수에 액세스하기
- 28. Silverlight/JavaScript를 통해 ActiveX 개체의 속성에 액세스하기
- 29. 루아 (iPhone SDK)를 통해 객체에 액세스하기
- 30. SetValue/GetValue 대 인수를 통해 배열에 직접 액세스하기
좋은 답변이지만 참고 문헌을 인용하고 싶을 수도 있습니다 ... http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html – Bryan