java - 为什么 JDK 动态代理只能使用接口(interface)?

标签 java dynamic-proxy

JDK Proxy类只接受工厂方法newProxyInstance()中的接口(interface)。

是否有可用的解决方法或替代实现方案? 如果我必须将方法提取到接口(interface)以便使它们能够与代理一起使用,那么用例是有限的。我想包装它们以在运行时应用基于注释的操作。

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

例如,这可以让您使用默认实现方法构建抽象类。但是您可以将增强器更改为任何您想要的。

关于java - 为什么 JDK 动态代理只能使用接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411129/

相关文章:

java - 第二次启动线程

java - Android:以编程方式设置复选框将文本位置设置在右侧

java - 理解 java.lang.reflect.InvocationHandler 的 invoke 方法的 "proxy"参数

java - 最新的 Jersey 示例不起作用

java - BluetoothLescan() 未找到任何设备

java - Java 中创建数组和数组列表是一回事吗?

java - 动态代理和检查异常

c++ - C++ 中的动态代理类。可能吗?

java - 如何在带参数的构造函数上使用动态代理?

java - 如何拥有一个带有2个接口(interface)的Spring动态代理?