2009-10-23 4 views
1

나는 빌 버크와 리차드 몬선 - 해펠로하고이 코드주석이 달린 개인 클래스 속성의 컨테이너 주입이 Java에서 어떻게 작동합니까?

@PersistenceContext(unitName="titan") private EntityManager manager; 

후 설정되지 않습니다이 필드에 액세스하는 방법을 (이 클래스를 가지고 제 4 장에서 엔터프라이즈 자바 빈즈 3.0 책을 읽기 시작했습니다 setter 메서드가없는 경우). 그렇다면 컨테이너가이 개인 필드를 실제 인스턴스로 어떻게 설정합니까? 나는 약간의 반성 및/또는 바이트 코드 마법이 진행되고 있다고 가정하고있다. 어떻게 이루어 졌는가?

답변

4

getDeclaredFields()은 클래스에서 선언 된 필드 목록을 리턴합니다.

컨테이너는 적절한 주석을 검사하는 모든 필드를 반복합니다. 필요한 필드가 발견되면, 그 필드에 보통 setAccessible(true)을 호출하여 정상적으로 액세스 할 수 없었던 코드에서 조작 할 수 있습니다.

0
manager.getClass().getDeclaredFields() 

필드에 액세스 할 수 있습니다. javadocs를 참조하십시오. here

+0

감사합니다. 캡슐화를 깨뜨리는 나에게 - 사적인 구성원이 임의로 설정할 수 있다면 요점은 무엇인가? 또는 주석이 어떻게 든 허용되는 것입니까? – blank

+0

캡슐화를 끊는 계약을 맺고 있다면 캡슐화를 해제하는 것이 안전합니다. :) 몇 가지 주석을 제공하는 것은 예를 들어 세터를 제공하는 것과 동일합니다. –

+0

그것은 반사가 허용하는 것입니다. 어떤 것을하기 위해 리플렉션을 사용하는 것은 편리합니다 ... 리플렉션을 사용하여 모든 코드를 작성하지 않아도됩니다. 그렇게하는 것은 어리석은 일입니다. 따라서 일반적으로 캡슐화가 손상되지 않습니다. – ColinD

관련 문제