专栏首页王念博客静态代理和动态代理的实现

静态代理和动态代理的实现

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

1.静态代理

1.1 定义接口

/**
 * 接口
 */
public interface UserService {

    /**
     * 添加方法
     */
    void add();

    /**
     * 删除方法
     */
    void delete();

}  

1.2 实现接口类

/**
 * 接口实现类
 */
public class UserServiceImpl implements UserService {


    @Override
    public void add() {
        System.out.println("--------------------add---------------");
    }

    @Override
    public void delete() {
        System.out.println("--------------------delete---------------");
    }
}  

1.3 代理类

/**
 * 代理类
 */
public class StaticProxy implements  UserService {

    UserService userService;
    public StaticProxy(UserServiceImpl userService){

            this.userService=userService;
    }

    @Override
    public void add() {
        userService.add();
        System.out.println("这是代理类做的事");
    }

    @Override
    public void delete() {
        userService.delete();
    }
}

1.4 测试静态代理

public class StaticTest {

    @Test
    public void test1(){
        UserService userService=new  StaticProxy(new UserServiceImpl());
        userService.add();
    }
}

2.动态代理

2.1 动态代理

/**
 * 实现自己的InvocationHandler
 */
public class MyInvocationHandler implements InvocationHandler {

    private static Object target;
    /**
     * 执行目标对象的方法
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在目标对象的方法执行之前简单的打印一下
        System.out.println("这是代理类做的事A");
        // 执行目标对象的方法
        Object result = method.invoke(target, args);
        // 在目标对象的方法执行之后简单的打印一下
        System.out.println("这是代理类做的事B");
        return result;
    }

    /**
     * 获取目标对象的代理对象
     *
     * @return 代理对象
     */
    public static Object getProxy(Object target) {
        MyInvocationHandler.target=target;
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler());
    }
} 

2.2测试

/**
 * 动态代理
 */
public class ProxyTest {

    @Test
    public void testProxy() throws Throwable {
        // 实例化目标对象  
        UserServiceImpl userService=new UserServiceImpl();

        // 根据目标对象生成代理对象  
        UserService proxy = (UserService) MyInvocationHandler.getProxy(userService);

        // 调用代理对象的方法  
        proxy.add();

    }
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringMvc解决js跨域

    跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求。比如说...

    王念博客
  • Dubbo使用jsr303框架hibernate-validator遇到 ConstraintDescriptorImpl could not be instantiated

    Dubbo可以集成jsr303标准规范的验证框架,作为验证框架不二人选的hibernate-validator是大家都会经常在项目中使用的,但是在Dubbo使用...

    王念博客
  • elasticsearch之基础

    Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它可以在很短的时间内存储,搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核...

    王念博客
  • RxAndroid完全教程

    不知现在的编辑,能否好用一些呢?希望大家有什么意见,在公众号直接回复即可,想了解哪些知识点,也可以直接留言了。 炎炎夏日,清凉一夏 这章节主要介绍下Rx系列的经...

    用户1263308
  • 设计模式-模板模式

    cwl_java
  • Android OkHttp的基本用法

    OkHttp可以说是如今最为流行的网络请求框架之一,今天来探究下OkHttp 的使用方法,包括Get 请求、Post 请求、上传下载文件、上传下载图片等功能

    叶应是叶
  • 滴滴大整改:9月8日至15日暂停深夜叫车服务

    9 月 4 日晚间,滴滴出行正式对外宣布,将于 9 月 4 日启动安全大整治。并宣布,在在以下主要措施落地前,滴滴出行将于 9 月 8 日 23 点至 9 月 ...

    AI科技大本营
  • Web监听器导图详解

      监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: ? Web监听器   1 什么是web监听器?   web监听器是一种Se...

    用户1154259
  • Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架

    基于Enterprise Library PIAB的AOP框架已经在公司项目开发中得到广泛的使用,但是最近同事维护一个老的项目,使用到了Enterprise L...

    蒋金楠
  • [设计模式]之十三:抽象工厂模式

    抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

    wOw

扫码关注云+社区

领取腾讯云代金券