개인 메소드가 리플렉션을 통해 호출되는 상황을 처리해야합니까?


12

라이브러리를 만들 때 같은 클래스의 다른 메서드가 아니라 리플렉션을 통해 다른 라이브러리 가 호출 할 때 개인 메서드가 예상대로 작동 해야하는지 확인해야 합니까?

예를 들어, 개인 메소드가 다음을 private DoSomething(int number)기대하는 경우 :

  • number 0이 아닌 양의 정수이며,
  • 개인 변수 string abc는 null이 아니며 빈 문자열이 아닙니다.

그리고 두 조건이 일치하지 않으면 못 생겨 실패합니다. 클래스의 모든 메소드 항상 abc호출 하기 전에 비어 있지 않은 값을 할당하고 DoSomething0이 아닌 양의 정수를 전달 한다는 것을 알고 있더라도 실패를 처리해야합니다. 방법?

다시 말해 리플렉션을 통해 안전하지 않은 통화로부터 보호되지 않는 코드는 저품질 코드로 간주 될 수 있습니까? 아니면 리플렉션을 사용하여 통화가 끊어지지 않도록하는 발신자의 코드 입니까?

참고 : 내 질문은 표준 라이브러리 세트에만 적용됩니다. 이것은 매우 안전해야하는 코드에는 적용되지 않습니다 (예 : 예상치 않게 작동하거나 충돌하기 위해 리플렉션을 사용하여 누군가가 관심을 가질 수있는 경우).


¹ 클래스가 올바르게 문서화 되었기 때문에 다른 개발자가이 메소드 등을 위반하지 않도록 충분한 단위 테스트가 있으므로


파생 클래스가 개인 메서드를 호출 할 수 있습니까?
oenone

답변:


16

분석법을 비공개로 표시하면 의도와 계약이 성립 된 것입니다. 리플렉션을 사용하면 클라이언트 코드가이 계약을 위반하도록 선택할 수 있으므로 결과를 가져와야합니다. 프로토콜에서도 마찬가지입니다. 규칙을 따라야합니다. 그렇지 않으면 나쁜 일이 발생할 수 있습니다.

C ++과 같은 다른 언어에서도 같은 문제가 발생할 수 있습니다.

#define private public

요약하면-이러한 상황을 처리 할 필요는 없지만 발신자는 더 잘 알아야합니다.


3
사람들이 클래스를 (서명되지 않은 char *)로 캐스팅하고 변경하려는 멤버 변수의 메모리 오프셋에 직접 쓰는 것을 보았습니다. 내 눈은 피를 흘렸다.
Shawn D.

6
위험한 특권 코드 로부터 클래스를 보호 하는 것은 본질적으로 불가능 하다고 덧붙 입니다. 만약 당신이 어떻게 든 부적절한 반사의 사용으로부터 자신을 보호한다면, 누군가는 단순히 프로세스 메모리를 직접 덮어 써서 하루를 망치는 다른 방법을 찾을 것입니다. 방어 적 코딩은 결국 수익을 감소시키는 지점에 이르고 반사는 그 지점을지나갑니다.
Aaronaught

5

누군가 리플렉션을 사용하여 개인 메서드를 호출하는 경우 누군가가 잘못하고 있다는 신호입니다. 그가 의도하지 않은 방식으로 코드를 사용하고 있거나 내부 작업을 너무 많이 숨기고 API를 바보로 사용하고 있습니다.

그러나 아직 그 단계에 있지 않은 것처럼 들리고 단지 선제하려고합니다. 제 의견은 걱정하지 마십시오. 개인용 메소드는 한계를 벗어난 것으로 간주해야합니다. 누군가가 의도적으로 그 한계를 위반하면 일이 터지면 문제가됩니다.


0

글쎄, 비 로컬 변수를 사용하기 전에 항상 유효성을 검사하는 것이 좋지만, 걱정하지 않아도됩니다. 다른 사람들이 말했듯이, 당신은 방법을 먼저 비공개로 만들어서 의도를 확립했습니다. 수업 밖에서 전화를하는 사람은 제로 보장이 없습니다. Java로 작업 할 때 다른 개발자가 자신이 있다는 것을 알기를 원하지 않기 때문에 개인 메소드에 javadoc 주석을 넣지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.