美文网首页
【转载】动态代理两种实现方式的示例

【转载】动态代理两种实现方式的示例

作者: f7629e2bca1c | 来源:发表于2021-10-01 08:40 被阅读0次

原文
Spring学习(五):动态代理的两种实现方式(全网最容易懂)_P@ssW0rd的博客-CSDN博客

1、基于JDK的动态代理
基于接口的动态代理,用到的类是Proxy的newProxyInstance静态方法创建,要求被代理对象至少实现一个接口,如果没有,则不能创建代理对象。

2、基于cglib的动态代理
要导入cglib第三方库,使用的类是Enhancer的create静态方法创建,要求被代理类不能是最终类,即不能用final修饰,如String类。

三、代码演示
1、首先创建一个IProduct接口,并创建被代理类,实现这个接口
IProduct

public interface IProduct {
    String sell(Float money);
    void afterSell();
}
public class Product implements IProduct {
    @Override
    public String sell(Float money) {
        System.out.println("代理员交给工厂:"+money);
        return "aaa";
    }
    @Override
    public void afterSell() {
        System.out.println("代理员做售后。。");
    }
}

通过JDK来实现动态代理,创建一个消费者Consumer
这里我们直接通过匿名内部类来实现,当然不是必须的

public class Consumer {
    public static void main(String[] args) {
        // 创建一个被代理对象
        final Product product = new Product();
        // 创建一个代理对象,并在InvocationHandler的invoke方法里面,对被代理类的方法做增强
        IProduct proxyProduct = (IProduct) Proxy.newProxyInstance(product.getClass().getClassLoader(), product.getClass().getInterfaces(), new InvocationHandler() {
            // 实现具体的增强操作           
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 获取方法在运行中可能产生的返回值
                Object returnValue = null;
                Float money = (Float) args[0];
                if("sell".equals(method.getName())){
                    // 执行具体的方法
                    returnValue = method.invoke(product, money*0.8F);
                }
                return returnValue;
            }
        });
        System.out.println(proxyProduct.sell(1000F));
    }
}


IProduct proxyProduct = (IProduct) Proxy.newProxyInstance(product.getClass().getClassLoader(), product.getClass().getInterfaces(), new InvocationHandler() {
}

ClassLoader loader获取被代理类的类加载器。
Class<?>[] interfaces获取被代理类的实现接口的数组。
InvocationHandler h在invok方法中对方法做增强处理。

invoke方法的三个参数

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
}
3、通过cglib来实现动态代理,创建一个消费者Consumer

public class Consumer {
    public static void main(final String[] args) {
        // 创建一个被代理对象,这里要求必须是final
        final Product product = new Product();
        Product proxyProduct =(Product) Enhancer.create(product.getClass(), new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Float money = (Float) objects[0];
                Object returnValue = null;
                if("sell".equals(method.getName())){
                    returnValue = method.invoke(product, 0.8f * money);
                }
                return returnValue;
            }
        });
        System.out.println(proxyProduct.sell(1000f));
    }
}

Enhancer.create的2个参数

Product proxyProduct =(Product) Enhancer.create(product.getClass(), new MethodInterceptor() {
}

Class type被代理类的class文件
Callback callback一个Callback接口,我们通常使用MethodInterceptor接口,继承了Callback接口
ntercept方法的参数

public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
}

Method method当前方法
Object[] objects方法用到的参数数组

相关文章

  • Java面试之Java基础下册(含答案)

    15.动态代理与cglib实现的区别。 动态代理有两种实现方式,分别是:jdk动态代理和cglib动态代理 jdk...

  • 基于反射的动态代理

    1 动态代理 动态代理的实现方式常用的有两种: 反射实现:基于反射实现,目标对象必须要有接口。生成的代理类是接口的...

  • JDK代理与CGLib代理的区别

    Spring的AOP动态代理有两种实现方式,那么这两种代理方式有什么区别呢? 区别 实现上,如果类是接口的时候或者...

  • Spring进阶之代理与AOP编程

    本文先介绍了代理中的静态代理,动态代理和Cglib代理,然后通过示例分别展示了如何通过注解和XML方式实现AOP编...

  • 反射高级应用:自定义 AOP 框架

    上一篇文章详细介绍了静态代理和动态代理的作用和实现方式,并介绍了动态代理实现的两种方式。熟练掌握反射技术是一个程序...

  • Java 动态代理机制解析

    通过这篇文章,你将了解Java的静态代理以及实现动态代理的两种方式,你还将能看到动态代理类结构信息。 既然有动态代...

  • 【啃啊啃 Spring5 源码】细碎三:AOP两种动态代理的区别

    spring 中 AOP是基于 “动态代理” 实现,其采用了两种方式: java代理:采用java内置的代理API...

  • 使用Javassist生成动态代理

    javassist生成动态代理有两种方式: 方式一:代理工厂方式,与JDk动态代理和CGLIB类似 方式二:动态代...

  • Spring AOP

    Joinpoint 通过spring AOP 的两种实现方式, 动态代理 CGLIB动态字节码增强技术可以得出,s...

  • Spring AOP中的动态代理

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: (3)静态代理与动态代理区别...

网友评论

      本文标题:【转载】动态代理两种实现方式的示例

      本文链接:https://www.haomeiwen.com/subject/rrepnltx.html