美文网首页
Java如何实现一个动态代理

Java如何实现一个动态代理

作者: 阿汐爹 | 来源:发表于2020-07-17 10:43 被阅读0次

1.编写两个接口

UserDao

import java.util.List;

public interface UserDao {
    List findAllUser();
    int getUser();
}

PersonDao

import java.util.List;

public interface PersonDao {
    List getAllPerson();
    int remove();
}

2.编写两个接口的实现类

UserDaoImpl

import com.dj.proxy.dao.UserDao;
import java.util.List;

public class UserDaoImpl implements UserDao {
    @Override
    public List findAllUser() {
        System.out.println("获取user全部用户");
        return null;
    }

    @Override
    public int getUser() {
        System.out.println("获取user");
        return 0;
    }
}

3.编写任务类

Plugin

public class Plugin {
    public void doStart(){
        System.out.println("start:我是事前工作方法");
    }
    public void doAfter(){
        System.out.println("after:我是事后工作方法");
    }
}

4.编写动态代理类

MyProxy

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

/**
 * 动态代理
 * 1.实现InvocationHandler接口
 * 2.新增一个方法bind(名称可以随意取),方法返回Object,返回值要用Proxy.newProxyInstance完成
 * 3.invoke方法里实现需要增加的动态代理的功能,返回值需是method.invoke(object,args)的返回值
 */
public class MyProxy implements InvocationHandler {
    //动态代理中增加的额外操作的类
    Plugin plugin;
    //原始类
    Object object;

    public Object bind(Object object,Plugin plugin){
        this.object = object;
        this.plugin = plugin;
        //对Object类实现代理
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //额外的操作1
        plugin.doStart();
        //原始类的方法调用
        Object invoke = method.invoke(object,args);
        //额外的操作2
        plugin.doAfter();
        //返回原始类
        return invoke;
    }
}

重点在于:

1.类要实现InvocationHandler接口

2.bind方法要返回Proxy.newProxyInstance

3.invoke方法要返回原始类的方法调用返回的Object

5.使用代理

ProxyTest

import com.dj.proxy.dao.PersonDao;
import com.dj.proxy.dao.UserDao;
import com.dj.proxy.impl.PersonDaoImpl;
import com.dj.proxy.impl.UserDaoImpl;

public class ProxyTest {
    public static void main(String[] args) {
        Plugin plugin = new Plugin();
        MyProxy proxy = new MyProxy();

        //对UserDao动态代理
        UserDao userDao = (UserDao) proxy.bind(new UserDaoImpl(),plugin);
        userDao.findAllUser();
        userDao.getUser();

        System.out.println();

        //对PersonDao动态代理
        PersonDao personDao = (PersonDao) proxy.bind(new PersonDaoImpl(),plugin);
        personDao.getAllPerson();
        personDao.remove();
    }
}

最终打印

start:我是事前工作方法
获取user全部用户
after:我是事后工作方法
start:我是事前工作方法
获取user
after:我是事后工作方法

start:我是事前工作方法
获取person全部用户
after:我是事后工作方法
start:我是事前工作方法
删除person
after:我是事后工作方法

相关文章

  • 设计模式

    结构型模式 介绍一下 如何实现动态代理? 考察点:动态代理流程参考回答: Java实现动态代理的大致步骤如下: 1...

  • 吊打面试官之 设计模式

    1. 介绍一下 如何实现动态代理? 参考回答: Java实现动态代理的大致步骤如下: 1.定义一个委托类和公共接口...

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • Java动态代理原理剖析(一)

    这篇文章将深入的分析Java的动态代理实现原理,首先将自己实现一个动态代理,然后顺势分析JDK中的动态代理实现并与...

  • java随笔(十一)

    java动态代理源码分析,总结。java动态代理实现步骤: 通过阅读源码发现,动态生成代理对象$Proxy0,该对...

  • Java动态代理简析原理

    说下Java动态代理,Spring的AOP就是基于Java的动态代理实现的。动态代理用到的几个类和接口,Proxy...

  • java 动态代理

    动态代理动态代理可以让我们在运行时动态生成代理类,解耦程度更高。Java 动态代理的实现主要借助于 java.la...

  • Java动态代理

    参考来源: Java动态代理视频 JDK动态代理实现原理 JDK Dynamic Proxies Building...

  • java 动态代理

    1、代理模式 2、java 动态代理2.1 InvocationHandler 实现类告诉程序运行动态生成的代理...

  • 代理模式

    JAVA的动态代理模式:A接口,A1子类实现A接口,A2子类实现A接口。那么JAVA的动态代理模式会A1、A2.....

网友评论

      本文标题:Java如何实现一个动态代理

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