package org.jboss.weld.interceptor.util.proxy;
import java.io.Serializable;
import java.lang.reflect.Method;
import org.jboss.weld.bean.proxy.MethodHandler;
/**
* @author Marius Bogoevici
*/
public abstract class TargetInstanceProxyMethodHandler<T> implements MethodHandler, Serializable {
private final T targetInstance;
private final Class<? extends T> targetClass;
public TargetInstanceProxyMethodHandler(T targetInstance, Class<? extends T> targetClass) {
this.targetInstance = targetInstance;
this.targetClass = targetClass;
}
public final Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
if (thisMethod.getDeclaringClass().equals(TargetInstanceProxy.class)) {
if (thisMethod.getName().equals("getTargetInstance")) {
return this.getTargetInstance();
} else if (thisMethod.getName().equals("getTargetClass")) {
return this.getTargetClass();
} else {
// we shouldn't arrive here
return null;
}
} else {
return doInvoke(self, thisMethod, proceed, args);
}
}
protected abstract Object doInvoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable;
public T getTargetInstance() {
return targetInstance;
}
public Class<? extends T> getTargetClass() {
return targetClass;
}
}