美文网首页
java代理之动态代理

java代理之动态代理

作者: Restart白蓝 | 来源:发表于2020-11-30 20:40 被阅读0次

接上一篇:静态代理

有人私信我文章代码都是截图的想用copy一份很麻烦,OK
哈哈,主要是图省事,往后我尽量贴出代码。
还是上篇的需求,商品出售前后需要做一些增强。

一、先创建一个商品出售的接口

package com.bailan.proxy.dynamicproxy;

public interface OrderService {
    String sell(String name);

    String show();
}

二、然后对其进行简单的实现

package com.bailan.proxy.dynamicproxy;

public class OrderServiceImpl implements OrderService {


    @Override
    public String sell(String name) {
        System.out.println("出售了商品"+name);
        return name;
    }

    @Override
    public String show() {
        String s = "所有商品";
        System.out.println("查看所有商品");
        return s;
    }
}

三、然后新建个类用来测试动态代理

我这里使用junit测试 就懒得写main方法调用了,代码都注视了。

package com.bailan.proxy.dynamicproxy;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class OrderServiceProxy {
    private OrderServiceImpl orderImpl = new OrderServiceImpl();

    @Test
    public void orderSellProxy() {
        /**
         * 这里三个参数分别是
         * 通过Proxy类的newProxyInstance方法创建代理对象,我们来看下方法中的参数
         * 第一个参数:orderImpl.getClass().getClassLoader(),使用handler对象的classloader对象来加载我们的代理对象
         * 第二个参数:orderImpl.getClass().getInterfaces(),这里为代理类提供的接口是真实对象实现的接口,这样代理对象就能像真实对象一样调用接口中的所有方法
         * 第三个参数:handler,一个代理类的调用处理程序,每个代理类的调用处理程序都必须实现InvocationHandler接口
         */
        OrderService orderService = (OrderService) Proxy.newProxyInstance(orderImpl.getClass().getClassLoader(), 
orderImpl.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * proxy:产生的代理对象的引用
             * method:当前正在调用的目标类的方法
             * params:只在执行的方法中的参数。
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //选择性增强
                if ("sell".equals(method.getName())) {
                    init();
                    String invoke = (String) method.invoke(orderImpl, args);
                    last();
                    //返回值增强
                    return "赠送键盘," + invoke;
                } else {
                    Object invoke = method.invoke(orderImpl, args);
                    return invoke;
                }
            }
        });
        //测试
        String s = orderService.sell("电脑1");
        System.out.println(s);
    }

    public void init() {
        System.out.println("售前准备");
    }

    public void last() {
        System.out.println("售后记录");
    }
}


四、来看看执行结果

完全不干扰其他代码,使用匿名内部类无需新建代理类,想在哪里用就哪里用。


image.png

五、最后根据网上资料查询总结如下

代理模式
  代理模式是常用的java设计模式(spring 中的AOP,struts2拦截器就是动态代理实现的),他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。  
代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
  按照代理的创建时期,代理类可以分为两种。
  静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
  动态代理:在程序运行时,运用反射机制动态创建而成。

动态代理实现
  java.lang.reflect.Proxy,
  Proxy 提供用于创建动态代理类和实例的静态方法.
  newProxyInstance()
  返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

外站参考资料
java的动态代理机制详解
http://www.cnblogs.com/xiaoluo501395377/p/3383130.html

相关文章

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • Spring AOP源码解析

    欲了解AOP,需先了解Java动态代理;欲了解Java动态代理,先熟悉设计模式之代理模式。入门有道,先从简学。 1...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • 设计模式之代理

    设计模式之代理模式 一、定义 在Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态...

网友评论

      本文标题:java代理之动态代理

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