为什么JDK动态代理只能与接口一起使用?

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));

}

}

例如,这使您可以使用默认的实现方法来构建抽象类。但是您可以将增强器更改为所需的增强器。

以上是 为什么JDK动态代理只能与接口一起使用? 的全部内容, 来源链接: utcz.com/qa/414665.html

回到顶部