Java의 생성자에서 인스턴스화하는 객체를 어떻게 잡을 수 있습니까?클래스의 생성자에서 인스턴스화하는 객체를 찾으십시오.
부모님 핸들러를 호출하는 이벤트 버블 링을 시뮬레이트하기 위해 일부 GUI 클래스의 부모 객체에 대한 참조를 저장하고 싶습니다. 그러나 기존 코드를 모두 바꾸고 싶지는 않습니다.
Java의 생성자에서 인스턴스화하는 객체를 어떻게 잡을 수 있습니까?클래스의 생성자에서 인스턴스화하는 객체를 찾으십시오.
부모님 핸들러를 호출하는 이벤트 버블 링을 시뮬레이트하기 위해 일부 GUI 클래스의 부모 객체에 대한 참조를 저장하고 싶습니다. 그러나 기존 코드를 모두 바꾸고 싶지는 않습니다.
짧은 대답 : Java에서 이것을 수행 할 방법이 없습니다. (어떤 클래스가 호출되었는지 알 수 있지만 아래의 긴 대답이 대부분 해당 부분에 적용됩니다.)
긴 대답 : 호출되는 위치에 따라 마술처럼 동작하는 코드는 거의 항상 나쁜 생각입니다. . 코드를 유지해야하는 사람은 누구나 혼란스럽고 리팩터링에 대한 귀하의 능력이 심각하게 손상됩니다. 예를 들어, 객체를 인스턴스화하는 장소 중 두 곳에서 동일한 로직을 기본 논리로 사용하므로 공통 비트를 제외하기로 결정했다고 가정합니다. 놀람! 이제 코드는 다른 곳에서 인스턴스화되기 때문에 다르게 동작합니다. 매개 변수를 추가하고 발신자를 수정하십시오. 장기적으로 시간을 절약 할 수 있습니다.
기존의 코드를 변경하지 않고도 메소드 호출 (생성자 포함)을 가로 채는 것은 Aspect-oriented programming이 만들어진 것 중 하나입니다.
처음으로 AspectJ을 확인하십시오.
AspectJ를 사용하면 특정 객체 또는 객체 세트 (필요한 경우 와일드 카드 사용) 및 차단 코드 ("advice")에 대한 생성자 호출을 가로 채기를 지정하는 "pointcut"을 정의 할 수 있습니다. 메소드와 객체 모두에 대한 정보를 포함하는 메소드 컨텍스트가 제공 될 것이다.
AspectJ를 사용하여 객체에 필드를 추가하여 기존 코드를 수정하지 않고 상위 참조를 저장할 수도 있습니다 (이것을 "소개"라고 함).
호출하는 클래스를 알고 싶다면 "this"를 생성자에 매개 변수로 전달하십시오.
Thing thing = new Thing(this);
편집 : 리팩토링 할이 매우 쉽게 만들 수 있도록 현대적인 IDE.
이것은 또한 'Thing'이 내부 클래스의 후보임을 나타냅니다. – erickson
입력 해 주셔서 감사합니다.하지만 코드베이스에 libs를 추가하는 것은 내가 원하는 작업이 아닙니다. 난 그냥 자바를 사용하여 문제에 빠르고 쉬운 솔루션을 기대했다. – Andreas
... 자바가됩니다! 죄송합니다. 저항 할 수 없습니다. 행운을 빕니다! – JoshJordan