首页 > 其他分享 >静态代理和动态代理

静态代理和动态代理

时间:2023-07-20 18:13:38浏览次数:35  
标签:JDK 静态 Object 代理 对象 动态 targetObject

spring Aop编程中常会使用代理操作。

代理即 为某⼀个对象创建⼀个代理对象,程序不直接⽤原本的对象,⽽是由创建的代理对象来控制对原对象,通过代理类这中间⼀层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间。

而代理又分静态代理和动态代理。

静态代理

由程序创建或特定⼯具⾃动⽣成源代码,在程序运行前,代理类的.class⽂件就已经存在通过将⽬标类与代理类实现同⼀个接⼝,让代理类持有真实类对象,然后在代理类⽅法中调用真实类⽅法,在调⽤真实类方法的前后添加我们所需要的功能扩展代码来达到增强的⽬的。   优点:   代理使客户端不需要知道实现类是什么,怎么做的,⽽客户端只需知道代理即可   ⽅便增加功能,拓展业务逻辑 缺点:   如果接⼝增加⼀个⽅法,除了所有实现类需要实现这个⽅法外,所有代理类也需要实现此⽅法。增加了代码维护的复杂度   代理类中出现⼤量冗余的代码,⾮常不利于扩展和维护   动态代理 在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码JDK动态代理与静态代理⼀样,⽬标类需要实现⼀个代理接⼝,再通过代理对象调⽤⽬标⽅法   一般常见的动态代理有JDK和CGLib JDK动态代理例子如下:
定义⼀个java.lang.reflect.InvocationHandler接⼝的实现类,重写invoke⽅法
//Object proxy:被代理的对象 
//Method method:要调⽤的⽅法 
//Object[] args:⽅法调⽤时所需要参数 
public interface InvocationHandler { 
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; 
}

实现类 public class JdkProxy implements InvocationHandler { //⽬标类 private Object targetObject; //获取代理对象 public Object newProxyInstance(Object targetObject){ this. targetObject = targetObject; //绑定关系,也就是和具体的哪个实现类关联 return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(),this); } public Object invoke(Object proxy, Method method, Object[] args) { Object result = null; try{ System.out.println("通过JDK动态代理调⽤ "+method.getName() +", 打印⽇志 begin"); result = method.invoke(targetObject,args); System.out.println("通过JDK动态代理调⽤ "+method.getName() +", 打印⽇志 end"); }catch (Exception e){ e.printStackTrace(); } return result; } }

 

两种动态代理的区别:   JDK动态代理:要求⽬标对象实现⼀个接⼝,但是有时候⽬标对象只是⼀个单独的对象,并没有实现任何的接⼝,这个时候就可以⽤CGLib动态代理   CGLib动态代理,它是在内存中构建⼀个⼦类对象从⽽实现对⽬标对象功能的扩展   JDK动态代理是⾃带的,CGlib需要引⼊第三⽅包   CGLib动态代理基于继承来实现代理,所以⽆法对final类、private⽅法和static⽅法实现代理 Spring AOP中的代理使⽤的默认策略:   如果⽬标对象实现了接⼝,则默认采⽤JDK动态代理   如果⽬标对象没有实现接⼝,则采⽤CgLib进⾏动态代理   如果⽬标对象实现了接扣,程序⾥⾯依旧可以指定使⽤CGlib动态代理

标签:JDK,静态,Object,代理,对象,动态,targetObject
From: https://www.cnblogs.com/Explosion556/p/17569212.html

相关文章

  • 关于Android 控件没有动态设置界面效果时,如何处理
    关于Android控件没有动态设置界面效果时,如何处理例子:android:scrollbarThumbVertical动态设置-->listView如果控件只有静态xml界面的设置,没有动态设置时,需要去查看安卓控件的源码,看该控件继承了那个父控件的方法,然后利用反射调用!不同的Android版本,源码可能不同!Android11.......
  • vue-element-admin改为从后台拿动态指令权限(按钮)- 下
    改为从后台拿动态指令权限,大概如下步骤:1、后台修改接口返回指令权限数据2、修改src/store/modules/permission.js修改generateRoutes,添加保存 指令权限3、修改验证指令去权限方法(checkPermission:src/utils/permission.js、v-permission:src/diective/permission/permi......
  • 20230719-动态规划DP
    20230719数位DPP4127[AHOI2009]同类分布题目描述传送门求出[a,b]中各位数字之和能整除原数的数的个数\(a,b≤1e18\)Solution对于这种求是否能整除的题我们只有在最后才能得到答案这道题很明显是数位DP考虑用记忆化搜索来实现对于每一位我们需要维护前面的数字之......
  • mysql 静态表
    实现MySQL静态表的步骤为了实现MySQL静态表,我们需要以下步骤:步骤描述1.创建数据库创建一个新的数据库,用于存储我们的静态表。2.创建表结构在数据库中创建一个新的表,并定义表的结构(列名和数据类型)。3.插入数据将需要存储的数据插入到表中。4.查询数......
  • Mac/Ubuntu18.04使用privoxy将socks转为https、http和ftp代理
    转载:https://blog.csdn.net/gongchenyu/article/details/80482981privoxy可以转换socks代理1.将socks代理地址设置为127.0.0.1:1080。2.安装privoxyUbuntu$sudoaptinstallprivoxy1Mac$brewinstallprivoxy13.更改provoxy配置Ubuntu$sudovi/etc/privoxy/config1Mac$......
  • Matlab马尔可夫区制转换动态回归模型估计GDP增长率|附代码数据
    原文链接:http://tecdat.cn/?p=19918最近我们被客户要求撰写关于马尔可夫区制转换动态回归的研究报告,包括一些图形和统计输出。本文估计实际GDP增长率的两状态Markov区制转换动态回归模型  ( 点击文末“阅读原文”获取完整代码数据******** )。创建模型进行估计通过指定转移......
  • 20230705-动态规划DP 2
    20230705单调队列优化DPHDU3401Trade题目大意传送门有T天,第i天买股票花Api元,卖股票花Bpi元,最多能买Asi股,能卖Bsi股。任何时候股票持有量不得超过MaxP,且两个交易日至少要间隔W天。若开始时有无限块钱,最后最多能赚多少钱?(你都有无限块钱了怎么赚都不会增加啊)0<=W<T<......
  • 20230703-动态规划DP 1
    20230703热身题目求长度为n的合法括号序列有多少个,对\(10^9+7\)取模。\(n\)为偶数,\(n\le10^6\)。Solution可以维护一个栈遇到一个左括号就加入栈而遇到右括号时就取栈顶的左括号与它配对出栈一个合法序列需要保证:最后栈为空,即所有的左括号都和有括号配对了中间不能出......
  • 流畅预览——设置代理剪辑
    画质太高导致预览卡顿需要使用ME来压缩画质怎么用4K的序列,但是预览的时候是720P的呢,选中这个切换代理......
  • Java 静态初始化创建
    Java静态初始化创建简介静态初始化是一种在声明变量时直接初始化的方式,它可以在不创建对象的情况下对变量进行初始化。本文将介绍如何使用Java静态初始化创建变量的步骤和相应的代码示例。步骤下面是创建Java静态初始化变量的步骤。步骤描述1声明一个静态变量。2......