SpringJDK动态代理实现

举报
牛哄哄的柯南 发表于 2021/05/26 15:31:02 2021/05/26
【摘要】 目录 JDK动态代理代码实现 JDK动态代理 JDK动态代理使用Proxy类里面的newProxyInstance方法创建代理对象。 Modifier and TypeMethod and Descriptionstatic ObjectnewProxyInstance(ClassLoader loader, 类<?>[] interfac...

JDK动态代理

JDK动态代理使用Proxy类里面的newProxyInstance方法创建代理对象。

Modifier and Type Method and Description
static Object newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

方法里有三个参数:
第一个参数:类加载器。
第二个参数:增强方法所在类,这个类实现的接口,支持多个接口。
第三个参数:实现这个接口InvocationHandler创建代理的对象,在这个类里写增强的方法。

代码实现

(1)创建接口,定义方法。
(2)创建接口实现类,实现方法。
(3)使用Proxy类创建接口代理对象。

UserDao接口:

package com.Keafmd.spring5;

/**
 * Keafmd
 *
 * @ClassName: UserDao
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-17 20:41
 */

public interface UserDao { public int add(int a,int b); public String updat(String id);
}

UserDaoImpl实现类:

package com.Keafmd.spring5;

/**
 * Keafmd
 *
 * @ClassName: UserDaoImpl
 * @Description: 实现类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-17 20:42
 */
public class UserDaoImpl implements UserDao{ @Override public int add(int a, int b) { System.out.println("add执行中..."); return a+b; } @Override public String updat(String id) { System.out.println("updat执行中..."); return id; }
}

JDKProxy类:

package com.Keafmd.spring5;

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

/**
 * Keafmd
 *
 * @ClassName: JDKProxy
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-17 20:44
 */
public class JDKProxy { public static void main(String[] args) { //创建接口实现类代理对象 Class[] interfaces = {UserDao.class}; /*Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } });*/ UserDaoImpl userDao = new UserDaoImpl(); UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao)); System.out.println("-----------对add方法进行增强----------"); int result = dao.add(1, 2); System.out.println("result:" + result); System.out.println("------------不增强updat方法------------"); String res = dao.updat("Keafmd"); System.out.println("res:" + res); }
}

//创建代理对象代码
class UserDaoProxy implements InvocationHandler { //把创建的是谁的代理对象,把谁传递过来 //有参构造传递 private Object obj; public UserDaoProxy(Object obj) { this.obj = obj; } //增强的逻辑 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("add".equals(method.getName())) { //通过判断实现对不同方法的增强 //方法执行之前 System.out.println("方法之前执行..." + method.getName()); //被增强的方法执行 Object res = method.invoke(obj, args); //方法执行之后 System.out.println("方法之后执行" + obj); return res; } else { //不增强 Object res = method.invoke(obj, args); return res; } }
}

输出结果:

-----------对add方法进行增强----------
方法之前执行...add
add执行中...
方法之后执行com.Keafmd.spring5.UserDaoImpl@5e481248
result:3
------------不增强updat方法------------
updat执行中...
res:Keafmd

Process finished with exit code 0

以上就是JDK动态代理的代码实现,在Spring5里面已经把动态代理的代码已经做了封装。

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

在这里插入图片描述

加油!

共同努力!

Keafmd

文章来源: keafmd.blog.csdn.net,作者:牛哄哄的柯南,版权归原作者所有,如需转载,请联系作者。

原文链接:keafmd.blog.csdn.net/article/details/112758678

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。