Java,어떻게 구축"프록시 wrapper"주위에 객체를 호출하는 방법에 따라 변경설턴트를 제공합니다.

StackOverflow https://stackoverflow.com/questions/474320

문제

나는 뭔가를 찾고와 유사한 패턴 프록시동적 프록시 클래스, 만 나는 원하지 않는 차단하는 메소드를 호출하기 전에 호출에 실 객체지만,오히려 나를 차단하는 속성되고 변경되었습니다.나는 같은 프록시하는 것을 나타낼 수 있는 여러 개체가 가진 다른 세트의 속성입니다.뭔가 프록시 클래스에서는 작업 스크립트 3 허용될 수 있습니다.

여기에 내가 달성하고 싶은 일반적인:

나는 스레드로 실행하는 개체의 목록을 관리하는 값(숫자,문자열,객체)이 되었손에 의해 다른 스레드 프로그램에서,그래서 클래스를 돌볼 수 있을 만드는 일정한 영구적인 스냅샷을 디스크에 대한 목적의 검사점 응용 프로그램.이 persistor 체를 관리하는"더러운"국기는 것을 의미하는지 여부의 목록을 값이 변경되었기 때문 마지막 체크포인트와 필요를 잠글 목록하는 동안 그것은 바쁜 그것을 작성하여 디스크에 있습니다.

이 persistor 및 다른 구성 요소를 식별하는 특정 항목 통해 일반적인 이름은,그래서 그 때부터 복구 충돌,다른 구성 요소를 먼저 확인하는 경우에는 persistor 는 그들의 최신 사본을 저장되고 작업을 계속합니다.

는 동안 정상 작동,작동하기 위해서는 개체들에게 넘겨 persistor,나는 그들이 받을 참조하는 프록시는 개체를 보이는 것처럼 보이지만 실제로 원래 하나,하지만 그 때마다 그들은 일부 변경 가치에 persistor 통지 및 행위에는 그에 따라,예를 들어 표시하여 품목 또는 목록으로 더러운 실제로 전에 설정된 실제 값입니다.


편집:또는 있는 일반 세터(처럼 PHP5)자바에서는 방법을 호출되는 경우 속성이 존재하지 않?는 있거나 종류의 개체할 수 있는 속성을 추가 런타임에?

도움이 되었습니까?

해결책

"속성"을 사용하면 Javabean Properties를 의미하는 경우, 즉 Bay는 Getter 및/또는 Setter 메소드를 나타냅니다. 그러면 동적 프록시를 사용하여 세트 방법을 가로 채울 수 있습니다.

인스턴스 변수를 의미하면 Java 레벨이 아닌 할 수 없습니다. 아마도 무언가가 할 수있을 것입니다 바이트 코드 레벨의 조작 그렇지만.

실제로, 가장 쉬운 방법은 아마도 사용하는 것입니다. 종자 그리고 set () pointcut (바이트 코드 레벨에서 필드 액세스를 가로 채겠습니다)을 정의합니다.

다른 팁

디자인 패턴을 찾는다:차동 실행됩니다.믿지 않습니다.

어떻게 차등 실행 작동하는가?

은 질문을 내가 응답되는 상품이다.

그러나 수 있습니다,나는 당신이 사용하여 콜백을까요?당신이 읽어야 이지만,일반적인 아이디어 구현할 수 있는 인터페이스를(자주라는 청취자)활성시"흥미로운 무언가를"일어나고 있다.과 같은 데이터 구조 변경 될 수 있습니다.

Obligitory 링크:

Wiki 차등 실행

위키 콜백

좋아요,여기에는 대답으로 나는 그것을 참조하십시오.차 실행 O(N)시간입니다.이것은 정말이 합리적이지만,작동하지 않는 경우 나중 콜백을 것입니다.콜백을 기본적으로 작동하여 전달하는 방법에 의해 매개변수는 클래스에는 변경을 배열입니다.이 방법은 걸릴 것입니다 값을 변경하고의 위치를 항목에 전달하여 다시 매개변수를"저장"값을 변경 approipriately.그래서,그렇다,당신은 다시 각각의 변경 방법으로 호출합니다.

나는 깨닫게 지금 이것이 당신이 원하는 것이 아니다.그것이 무엇이 나타나는 당신이 원하는 방식으로 제공할 수 있습니다 몇 가지 종류의 청취자에 각 변수에 배열하는 것이라고 경우는 항목이 변경되었습니다.청취자는 그 변경 해당하는 배에서 백업을 refect 수 있도록 도와줍니다.

기본적으로 생각할 수 없는 방법입니다.당신은 물론을 만들고,자신의 청취자와 이벤트,사용하는 인터페이스입니다.이것은 기본적으로 동일한 아이디어로 콜백하지만,더 좋습니다.

다음에 반영...Java 는 반사,그리고 나는 긍정적인할 수 있는 뭔가를 쓰고 그것을 사용하십니다.그러나,반사는 매우 느렸습니다.을 언급하지 않을 통해 코드(제 생각에).

희망하는 데 도움이...

메소드 호출이 실제 개체에서 호출되기 전에 가로 채고 싶지는 않지만 오히려 변경되는 속성을 가로 채고 싶습니다.

실제로, 모니터링하려는 물체는 편리한 콩이 아니라 C 구조의 부활입니다. 내 마음에 오는 유일한 방법은 JVMTI의 필드 액세스 전화.

나는 똑같은 일을하고 싶었다. 내 해결책은 Javassist를 사용하여 동적 프록시 랩퍼를 사용하는 것이 었습니다. 대상 객체의 클래스와 동일한 인터페이스를 구현하는 클래스를 생성하고, 원래 클래스 주위에 내 프록시 클래스를 감고, PropertyChangeEvent를 해고하는 세터를 제외하고는 원래 클래스 주위에 모든 메소드 호출을 원본으로 위임합니다.

어쨌든 나는 내 블로그에 전체 설명과 코드를 여기에 게시했습니다.http://clockwork-fig.blogspot.com/2010/11/javabean-property-change-listener-with.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top