package org.apache.cxf.common.util;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
*
*/
class CglibProxyHelper extends ProxyHelper {
CglibProxyHelper() throws Exception {
Class.forName("net.sf.cglib.proxy.Enhancer");
Class.forName("net.sf.cglib.proxy.MethodInterceptor");
Class.forName("net.sf.cglib.proxy.MethodProxy");
}
@Override
protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces,
final java.lang.reflect.InvocationHandler h) {
Class<?> superClass = null;
List<Class<?>> theInterfaces = new ArrayList<Class<?>>();
for (Class<?> c : interfaces) {
if (!c.isInterface()) {
if (superClass != null) {
throw new IllegalArgumentException("Only a single superclass is supported");
}
superClass = c;
} else {
theInterfaces.add(c);
}
}
if (superClass != null) {
Enhancer enhancer = new Enhancer();
enhancer.setClassLoader(loader);
enhancer.setSuperclass(superClass);
enhancer.setInterfaces(theInterfaces.toArray(new Class[]{}));
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
return h.invoke(obj, method, args);
}
});
return enhancer.create();
} else {
return super.getProxyInternal(loader, interfaces, h);
}
}
}
package org.apache.cxf.common.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
*
*/
public class ProxyHelper {
static final ProxyHelper HELPER;
static {
ProxyHelper theHelper = null;
try {
theHelper = new CglibProxyHelper();
} catch (Throwable ex) {
theHelper = new ProxyHelper();
}
HELPER = theHelper;
}
protected ProxyHelper() {
}
protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) {
return Proxy.newProxyInstance(loader, interfaces, handler);
}
public static Object getProxy(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) {
return HELPER.getProxyInternal(loader, interfaces, handler);
}
}