Java动态代理和AOP编程

Java之AOP面向切面编程(手动动态代理实现) 1、什么是AOP? AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 可能现在就开始懵B了,什么是面向切面编程?动态代理又是什么? 所以我不打算先解释概念了,直接举个栗子先!接着往下看哈! 2、什么是面向切面编程? 对于面向对象编程,相信大家都比较熟悉吧,直白的讲就是将数据与数据相应的操作进行... 阅读详情


一, 动态的核心

动态代理的两个核心,Proxy 和 InvocationHandler,都是Java.lang.reflect包下的接口类;由此也可以看出动态代理是反射的高级应用!

代理与反射的关系如何体现?从代理的建立过程的构建方法及其参数可见一斑:

1,代理最核心的Handler的唯一方法invoke()的核心参数Method method,是一个Class类型,并且在代理调用时,invoke到target对象来返回retval.

2,代理的构造方法参数, 也就是牛X的newProxyInstance()方法的前两个参数, 是目标接口的ClassLoader 和 Interface[ ],也是通过接口Class对象反射get到;

 

二, 代理的调用方法

Object invoke(Object proxy, Method method,Object[] args)  方法,该方法 在代理实例上处理方法调用并返回结果。

每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

三个参数的意思是:

Object proxy           在其上调用方法的代理实例

Method method     对应于在代理实例上调用的接口方法的Method 实例

Object[] args         包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为null

 

三, 代理实例的创建

方法一.1,通过Proxy.getProxyClass()方法创建若干接口的Class文件,

            2,通过Class文件可以得到其构造方法

             3,最后通过构造方法实例的newInstance方法得到代理实例

 

方法二.,通过Proxy的newProxyInstance() 方法,直接返回一个带有代理类的指定调用处理程序的代理实例,

              它由指定的类加载器定义,并实现指定的接口             

                     该方法的参数列表是:

                     ClassLoader  loader,    指定一个类加载器用于加载指定的接口

                     Class<?>[] interfaces,   给出需要创建代理实例的接口

                      InvocationHandlerh,      给出代理实例的调用处理程序实现的接口

 

显而易见,方法二是对代理逻辑的代码重新封装,有利于编写和管理三大代理构建参数,使大家可以集中精力去处理invoke()方法, target对象,切面信息(Advice),实现AOP编程;

 

以下为Proxy实例的建立,和进一步AOP编程的应用:

  
static void clazzProxy()throws Exception{  
  
       ClassclazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader() ,Collection.class);  
  
       System.out.println(clazzProxy1.getName());  
  
        
  
       System.out.println("---------------constructorslist--------------");  
  
       Constructor[]constructors = clazzProxy1.getConstructors();  
  
       for(Constructorconstructor : constructors){  
  
              Stringname = constructor.getName();  
  
              StringBuildersBuilder = new StringBuilder(name);  
  
              sBuilder.append('(');  
  
              Class[]clazzParams = constructor.getParameterTypes();  
  
              for(ClassclazzParam:clazzParams){  
  
                     sBuilder.append(clazzParam.getName()).append(',');  
  
              }  
  
              if(clazzParams.length==0)  
  
              sBuilder.deleteCharAt(sBuilder.length()-1);  
  
              sBuilder.append(')');  
  
              System.out.println(sBuilder);  
  
       }  
  
       System.out.println("-------------begincerate instance --------------");  
  
       Constructorconstructor = clazzProxy1.getConstructor(InvocationHandler.class);  
  
       classMyInvocationHandler1 implements InvocationHandler{  
  
   
  
              @Override  
  
              publicObject invoke(Object arg0, Method arg1, Object[] arg2)  
  
                            throwsThrowable {  
  
                     //TODO Auto-generated method stub   
  
                     returnnull;  
  
              }  
  
       };  
  
        
  
       Collectionproxy1 = (Collection)constructor.newInstance(new MyInvocationHandler1());  
  
       System.out.println("xxxxxxxxx"+proxy1.toString());//没有返回值的方法可以调用。有返回值的方法,可以调用   
  
       //proxy1.size();//不能调用,因为其没有指定目标   
  
       proxy1.clear();//可以调用   
  
        
  
       Collectionproxy2 = (Collection)constructor.newInstance(new InvocationHandler(){  
  
   
  
              ArrayListtarget = new ArrayList();  
  
              @Override  
  
              publicObject invoke(Object proxy, Method method, Object[] args)  
  
                            throwsThrowable {  
  
                     longbeginTime = System.currentTimeMillis();  
  
                     ObjectretVal = method.invoke(target,args);  
  
                     longendTime = System.currentTimeMillis();  
  
                     System.out.println(method.getName()+"运行时间"+(endTime-beginTime));  
  
                     returnretVal;  
  
              }  
  
               
  
       });  
  
       proxy2.add("zxx");  
  
       proxy2.add("Java01");  
  
       proxy2.add("Java");  
  
       proxy2.size();  
  
        
  
       Collection proxy3 = (Collection)Proxy.newProxyInstance(  
  
                     Collection.class.getClassLoader(),  
  
                     newClass[]{Collection.class},  
  
                     newInvocationHandler(){  
  
                            ArrayList target = new ArrayList();  
  
                            @Override  
  
                            publicObject invoke(Object proxy, Method method, Object[] args)  
  
                                          throwsThrowable {  
  
                                   longbeginTime = System.currentTimeMillis();  
  
                                   Object retVal = method.invoke(target,args);  
  
                                   longendTime = System.currentTimeMillis();  
  
                                   System.out.println(method.getName()+"运行时间:"+(endTime-beginTime));  
  
                                   return retVal;  
  
                            }  
  
                     }  
  
                     );  
  
       proxy3.add("Java01");  
  
       proxy3.add("Java02");  
  
       proxy3.add("Java03");  
  
       System.out.println(proxy3.size());  
  
}  
  
}  


 

深度理解,自己实现java动态代理、自动注入、切面编程(类似于Spring IOC、AOP) 阅读详情

相关推荐

通达信源码-主力建仓-AI投研图灵室出品

AI投研图灵室1:=3*SMA((CLOSE-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1)-2*SMA(SMA((CLOSE-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1),15,1);AI投研图灵室2W:=100-100*(HHV(HIGH,14)-CLOSE)/(HHV(HIGH,14)-LLV(LOW,14));AI投研图灵室3:=SMA(SMA(AI投研图灵室2,3,1),3,1);

qq_57222058的博客 4388

Java中的动态代理与AOP编程

Java中的动态代理与AOP编程大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java中的动态代理和面向切面编程(AOP),这两者是构建灵活且可扩展系统的重要工具。1. 动态代理概述在Java中,动态代理允许我们在运行时创建代理对象,从而可以在不修改现有代码的情况下增强或替换对...

weixin_41114591的博客 95

RK-XCKU5P RoCEv2 传感器桥工程分析报告

烧入后这块 FPGA 就是一个固定身份(CA:FE:C0:FF:EE:00 / 192.168.0.2 / 无 FEC 100G)的RoCEv2 UC 端点,每秒在 UDP 12267 广播自报家门;对端 CX5 只要关 FEC、配 192.168.0.101 +MTU 4200,就能 ping 通它、用 UDP 8192 读写它的全部寄存器、再按"ECB 旁路交换 QPN/rkey"的方式建立 UC RDMA 通道收发数据。

eloudy的专栏 245

Java动态代理及其AOP切面编程

动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要,动态创建目标类的代理对象。 代理的优势: 见该博客:https://www.cnblogs.com/gonjan-blog/p/6685611.html /** * 创建Person接口 * @author Gonjan */ public interface Person { //上交班费 ...

天上掉下两毛钱 613

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1640

I2C通信协议SCL与SDA引脚特性:核心要点总结

深入讲解I2C通信协议中SCL和SDA引脚的工作机制与电气特性,帮助理解i2c通信协议的稳定传输原理,掌握上拉电阻配置与信号时序控制要点。

weixin_42103128的博客 2739

Java spring AOP(面向切面编程) JDK动态代理示例

Java spring AOP面向切面编程JDK动态代理示例Java spring AOP(面向切面编程) JDK动态代理示例目标类目标类接口目标类实现切面类spring工厂测试 Java spring AOP(面向切面编程) JDK动态代理示例 本文引用B站老师(“一个体面的人”) spring框架教程相关内容,适合初学者理解使用 了解更多内容点击链接. AOP概念: (百度百科) AOP为As...

weixin_43801689的博客 455

Masta调用Geometry Modeller(Space Claim)进行根据三维模型快速建模设置方法

masta中调用ANSYS的space claim的设置方法

xifegnlie的博客 244

黑马程序员 Java创建动态代理类实现Aop编程

---------------------- android培训、java培训、期待与您交流! ---------------------- Java要创建动态代理类,这些类必须实现一个或多个接口,而这些类必须实现相同的接口,那么动态代理类是怎么执行的呢? 动态代理类通过InvocationHandler这个构造方法实现动态代理,当执行这些类中的某个方法时,InvocationHandle

JavaEE高级工程师的专栏 1297

Python 列表(list)所有方法超全汇总

以上就是 Pythonlist 列表全部 11 个内置方法的完整汇总,全覆盖、无遗漏。掌握所有列表方法,基本可以应对 99% 的列表操作场景,无论是日常开发、数据分析还是算法刷题都能高效编码。

jdksjw的博客 234

【即插即用模块】卷积篇 | TGRS 2025 | HLKConv:小核+空洞=大核,感受野一致,但更轻更准!

本文介绍了分层大核卷积模块HLKConv,该模块通过动态大核+空洞卷积实现高效感受野扩展,将超大核卷积分解为小核+空洞卷积(如53×53核用17×17+dilation=3实现),计算量仅为普通大核的1/10。模块采用双分支设计:基础卷积分支捕捉局部细节,大核空洞分支捕捉长距离关联,通过1×1卷积融合。实验表明HLKConv在红外小目标检测中优于传统大核卷积,适用于高分辨率视觉任务。代码实现了不同核尺寸的配置,输入输出特征维度保持不变,计算效率显著提升。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 346

java技术之动态代理以及AOP编程

写技术博客挺累的啊....总结了一下午总算是出来了~废话不多说,贴代码吧~ 名词解释: 动态代理:既指类的代理对象是动态生成的,而不是有程序员预先编写好的,这里利用java反射包中的类Proxy,核心代码如下: 通过 Proxy.getProxyClass(ClassLoader loader, Class... interfaces) 如:

zhuoni的博客 312

手把手教你学Simulink——基于Simulink的滑模控制器车辆稳定性仿真建模示例

本文详细介绍了基于Simulink的滑模控制器在车辆稳定性控制中的应用。通过建立二自由度车辆动力学模型(含魔术公式轮胎),设计横摆角速度与质心侧偏角滑模控制器,在Simulink中实现直接横摆力矩控制。文章包含完整的建模流程:从参考模型设计、滑模控制器推导(含等效控制和边界层法),到MATLAB参数设定和Simulink模块搭建。通过双移线测试和路面突变场景验证,证明该控制器能在低附着路面(μ=0.3)将横摆角速度误差控制在±5%以内,显著提升车辆稳定性。同时提供了工程实践要点和扩展方向(如高阶滑模、自适应

MHD0815的博客 106

Java中的动态代理与Spring AOP编程

一起深入了解Java中的动态代理和Spring AOP编程。从基本概念到高级应用,再到实战案例,希望这些内容能够帮助咱们更好地掌握这两项强大的技术。现在,让咱们在本章做一个总结回顾,巩固咱们所学的知识。通过动态代理和Spring AOP,咱们可以编写出更加模块化、可维护和可重用的代码,提高开发效率和代码质量。希望通过本系列文章的学习,咱们能够更加自信地在Java开发中使用这些强大的工具,写出更加优秀的代码。

宋小黑的博客 1055

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【069】Java利用动态代理模拟实现Spring的AOP(面向切面编程)功能的小实践

本文主要是带领读者实现一个小例子,来模拟 Spring 框架的面向切面编程(AOP)。实现过程中用到了 Java 的动态代理。

zhangchao19890805的专栏 1373

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

也谈用Java动态代理实现AOP(面向方面编程)

今天读了一篇谈面向方面实现的文章《谈用Java动态代理实现AOP》,颇有感触。经过思考,发现可以用这种方法经过改良实现多种AOP的模式。下面一一道来:一、动态横切假设现在存在一个类Business,如下:public class Business{    public void work(){        System.out.println("working...");    }}我们要对Bu

1078

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

4种实例 advice aop_Java动态代理在Spring的应用:AOP编程与动态代理知识

认真写文章,用心做分享。公众号:Java耕耘者 文章都会在里面更新,整理的资料也会放在里面。关于代理模式的话题有很多,在开发中经常用到的应该是静态代理模式,能很好的去耦合。动态代理是代理模式的另外一种实现。动态代理的区别在哪里?动态代理有什么好处?今天我们来分析下这些问题。回顾静态代理之前我们分析过一次静态代理,用代理模式优雅地写代码一个典型的代理模式的 Proxy类像下面这样, 代理模式Re...

weixin_31702225的博客 198

Java学习笔记4-- SpringAOP:面向切面编程(AOP)、Java的动态代理机制、Spring的通知类型、Aspectj开发

第三周笔记 SpringAOP:面向切面编程(AOP)、Java的动态代理机制、Spring的通知类型、Aspectj开发 1、AOP 1.什么是AOP? 1)AOP即面向切面编程 AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,一般适用于具有横切逻辑的场合。面向切面编程,就是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术。通过代理对象来调用原对象的方法代理对象方法;前后都

weixin_45800869的博客 440

cglib和jdk动态代理_Java动态代理在Spring的应用:AOP编程与动态代理知识

认真写文章,用心做分享。公众号:Java耕耘者 文章都会在里面更新,整理的资料也会放在里面。关于代理模式的话题有很多,在开发中经常用到的应该是静态代理模式,能很好的去耦合。动态代理是代理模式的另外一种实现。动态代理的区别在哪里?动态代理有什么好处?今天我们来分析下这些问题。回顾静态代理之前我们分析过一次静态代理,用代理模式优雅地写代码一个典型的代理模式的 Proxy类像下面这样, 代理模式Re...

weixin_39805195的博客 99

JAVA AOP编程之动态代理技术

java中的代理是什么呢? 比如说我们用到一个类A ,我们往常的方法就是直接使用这个类A  ,这样在大型的软件开发中有很大的局限性、 。    我们对于使用的类A的修改只能通过对源文件硬编码的修改, 代理就很好的突破了这个瓶颈。 在代理中我们可以定义一个类B,这个类B有个特点 就是和类A有着实现同样的接口 ,我们在类B中间接的调用了 类A,  我们也可以向这个代理的类插入一些通告消息类 。

Programmer小卫 4037

JAVA中的动态代理和AOP编程思想

1.动态代理 什么是代理模式及其作用    ProxyPattern(即:代理模式),23种常用的面向对象软件的设计模式之一代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。    只是看上面的概念陈述可能不太好理解。好比潘金莲和西门庆的故事一样,众所周知,潘金莲是

qq_32971807的博客 803

Springboot-公共字段填充(Java反射+动态代理+AOP面向切面编程+自定义注解)

通过定义切面类来指定前后处理逻辑和连接点。@Aspect@Component@Slf4j// 在执行被 @AutoFill 注解的方法之前执行的逻辑// 这里可以添加自动填充的逻辑,比如设置创建时间、更新时间等if (args!return;// 获取当前用户ID// 假设第一个参数是需要填充的实体对象// 设置创建时间、创建人等// 设置更新时间、更新人等} else {这个注解的含义是:标记的方法需要自动填充;

2301_80248554的博客 1314

Java面向切面编程AOP---动态代理实现

上一篇论述AOP动态代理的原理 这里显示实现其中的一种动态代理实现 需求:矩形计算周长 先有矩形的接口类: package com.mrchen.myredistest.chenstest; /** * 矩形 计算宽高 */ public interface Rectangle { /** * 加法 a+b *...

萌萌的博客 485

[Java]静态代理、动态代理、AOP编程代码实例

静态代理: package test1; //静态代理模式 //接口 interface ClothFactory{ void productCloth(); } //被代理类 class NikeClothFactory implements ClothFactory{ @Override public void productCloth() { // TODO Auto-generated method stub System.out.println("Nike工厂生产一批衣服");

mmmm0584的博客 213
上一篇: Java多线程同步的一层对象/二层对象/三层对象写法对比
marching21
博客等级 码龄12年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值