jdk动态代理

Posted zhaolei1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk动态代理相关的知识,希望对你有一定的参考价值。

jdk实现的动态代理只能是基于接口的;即被代理的对象

生成动态代理的类:

技术图片
public class ProxyTool {

    /**
     *  需要被代理的类
     */
    private Object obj;
    public ProxyTool(Object obj){
        this.obj = obj;
    }

    /**
     * Proxy.newProxyInstance()方法有三个参数:
     * ClassLoader:用于加载代理对象的字节码,与被代理对象的类加载器保持一致,固定写法
     * Class[]:字节码数据,用于让代理类与被代理类有相同的方法,固定写法
     * InvocationHandler: 用于提供增强的代码,InvocationHandler接口中有一个方法 invoke()
     *
     *
     * invoke中有三个参数:
     * proxy:代理对象
     * method:当前执行的方法
     * args:当前执行方法的参数
     * @return
     */
    public Object getProxy(){
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
                       //写增强代码的地方
                        System.out.println("动态代理生效");
                        return method.invoke(obj,args);
                    }
                });

    }
}
View Code

测试方法:

技术图片
public class Main {
    public static void main(String[] args) {
        //被代理对象
        IProxyImpl proxy1 = new IProxyImpl();
        //代理工具
        ProxyTool ProxyTool = new ProxyTool(proxy1);
        //获取到代理类,这个地方只能强转为接口,强转为实现类会报错
        IProxy proxy = (IProxy)ProxyTool.getProxy();

        //执行方法
        proxy.print();
    }
}
View Code

 

以上是关于jdk动态代理的主要内容,如果未能解决你的问题,请参考以下文章

JDK动态代理CGLIB动态代理

JDK动态代理CGLIB动态代理

(java反射-JDK动态代理)+CGLIB动态代理

JDK动态代理与Cglib动态代理

JDK动态代理与CGLib动态代理

代理模式(静态代理jdk动态代理CGLib动态代理)