文章目录

  • 介绍
    • jdk动态代理实例
    • cglib动态代理实例

介绍

JDK的动态代理只能代理实现了接口的类,而不能实现接口的类就不可以使用JDK动态代理,cglib是针对类来实现代理的,它的原理是针对指定目标生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,因此不能对final修饰的类进行代理。

jdk动态代理实例

目录:


代码:

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class jdkProxy {private Object target;public jdkProxy(Object target){this.target = target;//通过带参构造,传递目标对象}public Object getProxy(){ClassLoader classLoader = this.getClass().getClassLoader();//得到类加载器Class [] interfaces = target.getClass().getInterfaces();//注意是target.getclassInvocationHandler invocationHandler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//只要代理对象中的方法被调用了invoke就会执行一次//在invoke中执行目标对象的方法//method是目标对象的方法method.invoke(target,args);//target是要代理的对象,args是目标对象方法中的参数System.out.println("begin invoke");return null;}};//得到代理对象(代理实例)Object proxy = Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);return proxy;//返回代理}}
import bean.Marry;
import bean.Rent;
import bean.User;public class ProxyTest {public static void main(String[] args) {Rent rentTarget = new User();//目标对象jdkProxy jdkproxy = new jdkProxy(rentTarget);//目标对象传给带参构造器Rent rent1 = (Rent) jdkproxy.getProxy();rent1.RentHouse();//=====================================代理2===============================Marry marryTarget = new User();jdkProxy jdkproxy2 = new jdkProxy(marryTarget);Marry marry = (Marry) jdkproxy2.getProxy();marry.getMarry();}
}

接口:


public interface Marry {void getMarry();
}public interface Rent {public void RentHouse();
}

实现类:


public class User implements Rent,Marry {@Overridepublic void RentHouse() {System.out.println("rent house and jdkproxy 实现接口的实例");}@Overridepublic void getMarry() {System.out.println("实例的方法 getmarry 实现marry接口");}
}

测试的函数:


public class ProxyTest {public static void main(String[] args) {Rent rentTarget = new User();//目标对象jdkProxy jdkproxy = new jdkProxy(rentTarget);//目标对象传给带参构造器Rent rent1 = (Rent) jdkproxy.getProxy();rent1.RentHouse();//=====================================代理2===============================Marry marryTarget = new User();jdkProxy jdkproxy2 = new jdkProxy(marryTarget);Marry marry = (Marry) jdkproxy2.getProxy();marry.getMarry();}
}

输出:

cglib动态代理实例

cglib的关键是:继承(目标对象作为父类)
一定要注意导入cglib的jar:

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.cglib.proxy.MethodInterceptor;
import java.lang.reflect.Method;public class Cglibproxy {private Object target;
public Cglibproxy(Object target)
{this.target = target;
}
//获取代理对象
public Object getproxy()
{//通过enhancer对象的create()方法可以生成一个类,用于生产代理对象Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());//设置目标对象为父类MethodInterceptor methodInterceptor =  new MethodInterceptor() {@Overridepublic Object intercept(Object ob, Method method, Object[]obj, MethodProxy methodproxy) throws Throwable{System.out.println("方法执行前");Object object = methodproxy.invoke(target,obj);//调用目标对象的方法//进行行为增强 可以加入非业务之外的其他功能System.out.println("方法执行后");return object;}};enhancer.setCallback(methodInterceptor);//设置拦截器,回调对象为本身对象return enhancer.create();//返回生成的一个代理对象
}}
public class User2 {public void cglibtest(){System.out.println("测试cglib");}
}
public class CglibTest {public static void main(String[] args) {User2 user2 = new User2();Cglibproxy cglibproxy = new Cglibproxy(user2);User2 proxy = (User2)cglibproxy.getproxy();proxy.cglibtest();}
}

输出:

在这种代理下即使没有实现接口也没关系。

【过程记录】aop学习·实现动态代理的jdk方法和cglib方法和使用实例相关推荐

  1. Java动态代理之JDK实现和CGlib实现

    一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现 ...

  2. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  3. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  4. (JAVA学习笔记) Scanner类中next方法和nextline方法的区别

    next(): 1.一定要读取到有效字符后才可以结束输入. 2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或结束符. *4. ...

  5. html5语言追加append,动态展示,append方法和html方法的区别?

    append()方法在被选元素的结尾插入指定内容,html()方法返回或设置被选元素的内容. append(),从英文意义上append是在原有基础上增加,而html中是替换当前所有内容. 这里可以给 ...

  6. Spring——AOP学习(静态代理和动态代理模式)

    Spring--AOP学习(静态代理和动态代理模式) 一.代理模式 我们知道学习Spring最重要的两个知识点就是IOC和AOP,AOP的主要思想就是动态代理模式.在了解AOP之前我们必须学习动态代理 ...

  7. AOP处理事务静、动态代理(jdk方法)

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  8. java Spring的AOP理解和动态代理

    Spring的AOP OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些 ...

  9. AOP原理之动态代理

    个人博客:https://suveng.github.io/blog/​​​​​​​ AOP原理之动态代理 实现AOP的底层是反射机制,其中有两种实现方式: 其一是JDK的动态代理: 其二是基于CGL ...

最新文章

  1. 784.字母大小写全排列
  2. android o miui特性,终于来了,小米开启 Android O 内测
  3. java: http请求和响应
  4. linux查看java运行日志,Linux下查看日志用到的经常使用命令
  5. 精选| 2021年5月R新包推荐(第54期)
  6. 继承20161223
  7. PostgreSQL用户登录失败自动锁定的解决办法
  8. php 页面执行时长
  9. intellij idea 主题下载网站
  10. 快速合并所有txt文档
  11. QQ坦白说解密(一)
  12. 如何在Android上关闭YouTube烦人的自动播放缩略图
  13. maximo工作流画布加载失败问题
  14. payjs 源码_WordPress插件:Payjs For Ponits基于Payjs开发的积分充值微信支付插件
  15. 信息系统项目管理师与系统集成项目管理工程师5大区别
  16. 零基础学习 iOS 开发
  17. 使用ICMP协议检测网络状态
  18. eclipse的web工程中导入jir包如何放到lib目录中
  19. 移动硬盘/U盘中的可执行文件打开时提示“Windows 无法访问指定设备、路径或文件。您可能没有合适的权限访问这个项目。”
  20. c语言编程绘制动态波形,绘制wav波形图

热门文章

  1. java集群_Kafka多节点分布式集群搭建实现过程详解_java
  2. php study 直接显示代码_PHP获取文件大小的方法详解(附视频)
  3. linux字符串转大写_在 Linux 命令行中转换大小写
  4. Java中byte[]与十六进制之间的转化
  5. 二十三、Java类中重载和重写的区别
  6. 七十七、SpringBoot整合Rabbitmq
  7. scikit-image 几个案例(下)
  8. WWW 2020 | 信息检索中的对话式问题建议
  9. 智能写作全景介绍:从最新前沿技术到行业落地解析
  10. ACL 2020 | 用于链接预测的开放知识图谱嵌入