本文介绍了为什么JDK动态代理仅适用于接口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
JDK Proxy类仅接受工厂方法newProxyInstance()中的接口。
The JDK Proxy class only accepts interfaces in the factory method newProxyInstance().
是否有可用的解决方法或替代实施?
如果我必须将方法提取到接口以便使它们与代理一起使用,则用例是有限的。我想将它们包装起来以在运行时应用基于注释的操作。
Is there a workaround available, or alternative implementations?The use cases are limited if I have to extract methods to an interface in order to enable them for use with a proxy. I would like to wrap them to apply annotation based actions during runtime.
public static <T> T getProxy(T obj) {
InvocationHandler ih = new InjectProxy( obj );
ClassLoader classLoader = InjectProxy.class.getClassLoader();
return (T) Proxy.newProxyInstance( classLoader, obj.getClass().getInterfaces(), ih );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
推荐答案
你可以像这样使用cglib:
You can use cglib like this:
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class AbstractFactory {
@SuppressWarnings("unchecked")
public static <A> A createDefaultImplementation(Class<A> abstractClass) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(abstractClass);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if (!Modifier.isAbstract(method.getModifiers())) {
return methodProxy.invokeSuper(proxy, args);
} else {
Class type = method.getReturnType();
if (type.isPrimitive() && !void.class.equals(type)) {
return Array.get(Array.newInstance(type, 1), 0);
} else {
return null;
}
}
}
});
return (A) enhancer.create();
}
@SuppressWarnings("unchecked")
public static <A> A createDefaultImplementation(String className) throws ClassNotFoundException{
return (A) createDefaultImplementation(Class.forName(className));
}
}
例如,这允许您使用默认值构建抽象类实施方法。但是你可以将增强器改为你想要的。
This for example lets you build abstract classes with a default implementation method. But you can change the enhancer to what ever you want.
这篇关于为什么JDK动态代理仅适用于接口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!