JDK Proxy类仅在工厂方法newProxyInstance()中接受接口。
是否有可用的解决方法或替代实施?如果我必须将方法提取到接口以使其能够与代理一起使用,则用例是有限的。我想包装它们以在运行时应用基于注释的动作。
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:
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)); } }
例如,这使您可以使用默认的实现方法来构建抽象类。但是您可以将增强器更改为所需的增强器。