2009-09-27 2 views

답변

5

짧은 대답 : Java에서 이것을 수행 할 방법이 없습니다. (어떤 클래스가 호출되었는지 알 수 있지만 아래의 긴 대답이 대부분 해당 부분에 적용됩니다.)

긴 대답 : 호출되는 위치에 따라 마술처럼 동작하는 코드는 거의 항상 나쁜 생각입니다. . 코드를 유지해야하는 사람은 누구나 혼란스럽고 리팩터링에 대한 귀하의 능력이 심각하게 손상됩니다. 예를 들어, 객체를 인스턴스화하는 장소 중 두 곳에서 동일한 로직을 기본 논리로 사용하므로 공통 비트를 제외하기로 결정했다고 가정합니다. 놀람! 이제 코드는 다른 곳에서 인스턴스화되기 때문에 다르게 동작합니다. 매개 변수를 추가하고 발신자를 수정하십시오. 장기적으로 시간을 절약 할 수 있습니다.

1

기존의 코드를 변경하지 않고도 메소드 호출 (생성자 포함)을 가로 채는 것은 Aspect-oriented programming이 만들어진 것 중 하나입니다.

처음으로 AspectJ을 확인하십시오.

AspectJ를 사용하면 특정 객체 또는 객체 세트 (필요한 경우 와일드 카드 사용) 및 차단 코드 ("advice")에 대한 생성자 호출을 가로 채기를 지정하는 "pointcut"을 정의 할 수 있습니다. 메소드와 객체 모두에 대한 정보를 포함하는 메소드 컨텍스트가 제공 될 것이다.

AspectJ를 사용하여 객체에 필드를 추가하여 기존 코드를 수정하지 않고 상위 참조를 저장할 수도 있습니다 (이것을 "소개"라고 함).

+0

입력 해 주셔서 감사합니다.하지만 코드베이스에 libs를 추가하는 것은 내가 원하는 작업이 아닙니다. 난 그냥 자바를 사용하여 문제에 빠르고 쉬운 솔루션을 기대했다. – Andreas

+0

... 자바가됩니다! 죄송합니다. 저항 할 수 없습니다. 행운을 빕니다! – JoshJordan

3

호출하는 클래스를 알고 싶다면 "this"를 생성자에 매개 변수로 전달하십시오.

Thing thing = new Thing(this); 

편집 : 리팩토링 할이 매우 쉽게 만들 수 있도록 현대적인 IDE.

+0

이것은 또한 'Thing'이 내부 클래스의 후보임을 나타냅니다. – erickson