2012-01-30 2 views
1

개체를 동적으로 확장하기 위해 클래스 메서드 사이에 끼워 넣고 싶습니다.자바 클래스 메서드에 끼어 들기 (인터페이스 없음)

나는 java.lang.reflect.Proxy에 대해 이미 알고 있지만 실제 삽입하는 데 너무 제한되어 있습니다.

Using java.lang.reflect.Proxy to Interpose on Java Class Methods에서 첫번째 제한은 :

(...) 방법이 프록시 클래스의 인스턴스를 통해 호출한다. 따라서 중첩 된 메소드 호출은 가로 챌 수 없습니다.

그리고 최악의 하나

(...) 방법은 프록시되고있는 object에 의해 구현되는 인터페이스에 정의되어 있어야합니다. 인터페이스를 구현하지 않는 클래스의 인스턴스를 통해 호출 할 수 없습니다.

런타임시 확장 할 개체는 인터페이스를 구현하지 않으며 최악의 경우 재정의해야하는 메서드가 중첩되어 있고 전용입니다.

나는이 파이썬 & C에서 상당히 쉽게 알고, 위에서 언급 한 기사는 가능할 수 있다고 말한다 :이 시리즈의

다음 기사는 이러한 한계를 극복하기위한 몇 가지 기술을 설명 할 것이다.

불행히도이 기사를 찾을 수 없습니다. CGLIB를 사용

+4

그 기사는 2001 년입니다. * 11 살 *. 실험을 토대로 선사 시대적인 것을 찾아 내려고 시도 할 수도 있습니다. – skaffman

+2

이런 종류의 변경은 대개 매우 나쁜 프로그래밍 습관으로 간주됩니다. 유지 보수가 불가능하고 지원이 불가능한 코드로 이어질 수 있습니다. 당신이 제안하는 것은 일반적으로 더 좋은 방법을 가지고 있습니다. 나는 당신이 염두에두고있는 문제에 대한 특별한 해결책을 가지고 있다고 의심한다. 동일한 문제에 대한 다른 해결책을 고려해 주시겠습니까? –

+0

때때로 해킹 만 수행하는 유일한 방법입니다. (긴) 이야기에 관심이 있다면, PM =) –

답변

3

시도 : 여기

내가 몇 년 전에 쓴 튜토리얼, CGLIB에 그것의 아주 간단 소개 : 당신이 더 많은 전력이 필요하면 CGLIB intro

은, 사용하는 것을 고려 AspectJ

희망이 있습니다

+0

+1을 AspectJ에 보내면, 아마도 당신이 필요로하는 것 이상을 모두 할 수있을 것이다. – Marcelo

+0

나는 그것이 안드로이드와 관련이 있다는 것을 정확히 잊는다. AspectJ는 Android와 호환됩니까? –

관련 문제