JDK动态代理(必须要有接口,代理类和被代理类实现相同的接口)

public class UserServiceJDKProxy {

    public static UserService createUserServiceJDKProxy(final UserService userService) {
//ClassLoader loader : 被代理类对象的类加载器
//Class<?>[] interfaces : 被代理类对象所实现的所有接口
//InvocationHandler h : 执行方法增强的处理器
Object proxyInstance = Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
// 目标方法增强
(proxy, method, args) -> {
//Object proxy : 代理类对象
// Method method : 被代理类的原方法
// Object[] args : 被代理类的原方法的实参
Object result = null;
if ("selectAll".equals(method.getName()) || "deleteUser".equals(method.getName())) {
//是selectAll方法和deleteUser方法才增强
//权限校验
System.out.println("权限校验");
//执行被代理类的目标方法
result = method.invoke(userService, args);
//日志记录
System.out.println("日志记录");
} else {
//不是addUser方法和deleteUser方法执行目标方法
result = method.invoke(userService, args);
} return result;
}
);
return (UserService) proxyInstance;
}
}

Cglib动态代理(不限定是否具有接口,可以对任意操作进行增强.不需要原始被代理类对象,动态创建新的代理对象)

/**
* 获取代理类对象
*
* @param clazz 被代理类的字节码对象
* @return 返回代理类对象
*/
public static UserService createUserServiceCglibProxy2(Class clazz) {
// 创建cglib动态代理核心对象
Enhancer enhancer = new Enhancer();
// 设置被代理类是代理类的父类
enhancer.setSuperclass(clazz);
// 方法增强
enhancer.setCallback(new MethodInterceptor() {
/**
*
* @param proxy 代理类对象
* @param method 被代理类的目标方法
* @param args 被代理类的目标方法的实参
* @param methodProxy 代理类的方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object result = null;
// 判断哪些方法需要增强
if ("selectAll".equals(method.getName())) {
//权限校验
System.out.println("权限校验");
//执行被代理类的目标方法
result = methodProxy.invokeSuper(proxy, args);
//日志记录
System.out.println("日志记录");
} else {
//不是addUser和deleteUser执行目标方法
result = methodProxy.invokeSuper(proxy, args);
}
return result;
}
});
// 返回动态创建的代理对象
return (UserService) enhancer.create();
}

JDK动态代理~Cglib动态代理,进行方法的增强的更多相关文章

  1. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  2. 【Java入门提高篇】Day12 Java代理——Cglib动态代理

    今天来介绍另一种更为强大的代理——Cglib动态代理. 什么是Cglib动态代理? 我们先回顾一下上一篇的jdk动态代理,jdk动态代理是通过接口来在运行时动态创建委托类的代理对象,但是跟静态代理一样 ...

  3. Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理

    1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...

  4. java 静态代理 JDK动态代理 Cglib动态代理

    下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...

  5. Java JDK Proxy和CGLib动态代理示例讲解

    简介 代理模式在Java中有很多应用场景,而代理又分静态代码和动态代理.静态代理是编写.编译或加载时织入代码实现,而动态代理则在运行时实现.简单而言,静态代理是在运行前就已经存在,而动态代理则在运行时 ...

  6. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ...

  7. JDK和CGLIB动态代理原理区别

    JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...

  8. 静态代理,动态代理和CGLIB代理模式

    代理模式 一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目 ...

  9. Java深入浅出系列(四)——深入剖析动态代理--从静态代理到动态代理的演化

    静态代理 如上图,在程序执行之前.程序猿就要编写Proxy.然后进行编译,即在程序执行之前,代理类的字节码文件就已经生成了(Proxy类的class文件已经存在了). 静态代理尽管在增强现有的接口业务 ...

  10. java 代理模式-静态代理与动态代理

    最近在研究SpringAOP,当然要学习AOP就要知道这么健硕.强大的功能的背后究竟隐藏着怎样不可告人的“秘密”?? 接下来就是查阅了许多资料详细的研究了一下Java的代理模式,感觉还是非常非常重要的 ...

随机推荐

  1. LeetCode46全排列(回溯入门)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 题目描述 难度:中等 给定一个不含重复数字的数组 nu ...

  2. 震坤行根据ID取商品详情 API

    item_get-根据ID取商品详情 注册开通 zhenkunhang.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) se ...

  3. 前端设计模式:单例模式(Singleton)

    00.基本概念 单例模式(Singleton Pattern),也称单体模式,就是全局(或某一作用域范围)唯一实例,大家共享.复用一个实例对象,也可减少内存开销.单例模式应该是最基础.也最常见的设计模 ...

  4. Building-Mobile-Apps-with-Ionic-2中文翻译工作

    最近没啥工作量, 然后学完了这本书, 接着又茫然找不到该干啥, 所以想着何不翻译这个书呢. 这本书首先给我们普及了Ionic 2的基础知识, Ionic 2和Ionic 1有本质上的区别, Ionic ...

  5. python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载

    上一篇提到过类的属性,但没有详细介绍,本篇详细介绍一下类的属性 一 .类的属性 方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个boss类,它的生命值就是 ...

  6. ORACLE错误代码一览表,方便大家查询!

    ORACLE错误一览表,方便大家查询! ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...

  7. ESP32

    Main menu   Search Create account Log in Personal tools     Apply for a scholarship & submit you ...

  8. Android应用中对于微信分享的实例及问题

    源码地址 如何分享 分享无相应 分享结果如何接收响应 微信 分享回调 (提示几点关键问题:   debug_key 一定要获得对应的签名码 然后和weixin官网的appid对应     ) 几点注意 ...

  9. 小米手机抓取Log教程

    当小米手机遇到任何系统下的较为严重的故障时(即此时系统还是基本正常运行的,只是某些功能实现出了问题),例如软件自动退出,SD卡自动卸载,电话无法拨出等等.可以请用户协助抓取log即系统运行日志,来发送 ...

  10. LVS+keepalived配置高可用架构和负载均衡机制(1)

    一.基础知识 1. 四层负载均衡(基于IP+端口的负载均衡) 所谓四层负载均衡,也就是主要通过报文中的目标ip地址和端口,再加上负载均衡设备设置的服务器选择方式(分发策略,轮询),决定最终选择的内部服 ...