동적 프록시를 만들고 싶습니다. 동적 프록시는 메소드를 다른 구현에 위임 할 수 있습니다 (각 메소드 호출은 잠재적으로 다른 객체를 선택합니다). 그리고 나는 프록시 된 메소드가 다른 프록시 된 메소드를 호출 할 때 객체 선택 메커니즘이 다시 적용되는 것처럼 다형성 효과를 얻고 싶습니다.다형성 위임을 사용하여 동적 프록시를 만드는 방법은 무엇입니까?
interface IService {
void a();
void b();
}
class HappyService implements IService {
public void a() {
System.out.println("Happy a");
b();
}
public void b() {
System.out.println("Happy b");
}
}
class SadService implements IService {
public void a() {
System.out.println("Sad a");
b();
}
public void b() {
System.out.println("Sad b");
}
}
지금, 난 항상 방법 b()
의 호출을위한 방법 a()
및 SadService
의 호출에 HappyService
를 선택 IService
에 대한 프록시를 만들려면 :
좋아, 충분히 혼란, 여기에 예입니다. 여기에 처음에는 내 마음에 오는 것입니다 :
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
Object impl;
if (method.getName().equals("a")) {
impl = new HappyService();
} else if (method.getName().equals("b")) {
impl = new SadService();
} else {
throw new IllegalArgumentException("Unsupported method: " + method.getName());
}
return method.invoke(impl, args);
}
};
IService service = (IService)Proxy.newProxyInstance(IService.class.getClassLoader(), new Class[]{ IService.class }, h);
service.a();
이 인쇄 :
Happy a
Happy b
그래, a()
의 내부 b()
의 호출은 동적 프록시에 대해 아무것도 모르기 때문에 그건.
그래서 목표를 달성하는 가장 좋은 방법은 무엇입니까? 내 원하는 출력은 다음과 같습니다 아마 a()
HappyService
만 방법을 전달하고 다른 모든 방법 원래 프록시 리디렉션 또 다른 프록시로 호출 핸들러 안에 내 new HappyService()
을 대체 할 수
Happy a
Sad b
. 그러나 더 나은/더 쉬운 해결책이있을 수 있습니까?
어, 나는 지난 단락에서 아이디어를 시도했지만 지금은 그것을 할 수 없다는 것을 알았습니다. 그래서 나는 완전히 붙어있다. – vadipp
동일한 문제가 발생하여 [javassist] (http://www.javassist.org)를 사용하여 java.lang.reflect.Proxy를 사용하지 않고 프록시를 작성했습니다. 예를 들어 https://github.com/hertzsprung/autumn/blob/master/src/main/java/uk/co/datumedge/autumn/Singletoniser.java를보십시오. – hertzsprung