当前位置: 首页 > news >正文

陕西交通建设集团蓝商分公司网站南宁外贸网站建设功能公司

陕西交通建设集团蓝商分公司网站,南宁外贸网站建设功能公司,网站是专门对生活中的一些所谓常识做辟谣的,企业网页制作方面【README】 本文阐述了3种代理模式的定义#xff0c;并编写了代码测试案例#xff1b; 代理其实是一种设计模式#xff0c;可以在访问目标对象的方法上下文添加处理逻辑#xff08;扩展目标对象的功能#xff09;#xff0c;是 切面编程的基石#xff1b; 【举个例子】…【README】 本文阐述了3种代理模式的定义并编写了代码测试案例 代理其实是一种设计模式可以在访问目标对象的方法上下文添加处理逻辑扩展目标对象的功能是 切面编程的基石 【举个例子】 抖音直播带货就是一种代理模式主播代理了工厂对象提供了购买商品的方法 主播可以下调商品价格因为走量类似于在购买商品方法上文添加了逻辑 主播可以赠送其他商品类似于在购买商品方法下文添加了逻辑 【代理模式URL】 1.定义一个带有代理方法的接口 2.定义目标对象实现这个接口 3.定义代理对象实现这个接口且代理对象调用目标对象的对应方法 4.客户端调用代理对象的方法代理对象接着调用目标对象的方法且代理对象可以在上下文添加逻辑代理模式的目的所在 【1】静态代理编译时生成代理类class文件 1代码结构 需要代理对象和目标对象实现相同接口 2优点可以在不修改目标对象的前提下扩展其功能 3缺点 冗余每次代理都要定义一个代理类会产生过多代理类不移维护 一旦接口方法有增删改则代理对象和目标对象都需要修改 【1.1】静态代理代码示例 // 接口 public interface IUserDao {public void sayHello(); }// 目标类 public class UserDaoImpl implements IUserDao {Overridepublic void sayHello() {System.out.println(i am method named sayHello.);} }// 代理类 public class UserDaoStaticProxy implements IUserDao {private IUserDao target;public UserDaoStaticProxy(IUserDao target) {this.target target;}Overridepublic void sayHello() {System.out.println(before);target.sayHello();System.out.println(after);} } main方法 public class StaticProxyTest {public static void main(String[] args) {// 目标对象IUserDao target new UserDaoImpl();// 代理对象UserDaoStaticProxy proxy new UserDaoStaticProxy(target);// 调用代理方法proxy.sayHello();} } 执行结果  before i am method named sayHello. after 【2】动态代理运行时生成代理对象 1为了解决静态代理会有多个代理类不易维护的缺点我们引入了动态代理 2动态代理利用了JDK API动态地在内存中构建代理对象从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。 3静态代理与动态代理的区别主要在 静态代理在编译时就已经实现编译完成后代理类是一个实际的class文件动态代理是在运行时动态生成的即编译完成后没有实际的class文件而是在运行时动态生成类字节码并加载到JVM中 4优点 不需要代理对象实现接口但目标对象必须实现接口 5底层实现 底层调用了 // 生成代理对象 Proxy.newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h) loader 目标对象的类加载器interfaces 目标对象实现的接口class数组InvocationHandler将目标方法调用分配到的调用处理器对象 6调用处理类实现接口 InvocationHandler 类描述InvocationHandler 是代理对象关联的调用处理程序所实现的接口。 每个代理对象都有一个关联的调用处理程序。 当在代理对象上调用方法时方法调用被编码并分派到其调用处理程序的调用方法。 public interface InvocationHandler {public Object invoke(Object proxy, Method method, Object[] args)throws Throwable; } 方法描述处理代理对象上的方法调用并返回结果。 当在与其关联的代理对象上调用方法时将在调用处理程序上调用本方法。 【2.1】动态代理代码示例 // 目标对象的接口 public interface IUserDao2 {public String sayHello(); }// 目标对象所属类 public class UserDaoImpl2 implements IUserDao2 {Overridepublic String sayHello() {String msg i am method named sayHello. by dynamic proxy; System.out.println(msg);return msg;} }// 生成代理对象工厂 public class DynamicProxyFactory {private DynamicProxyFactory(){}public static Object getProxyInstance (Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(before);// 执行目标方法Object result method.invoke(target, args);System.out.println(after);return result;}});} } main方法 public class DynamicProxyTest {public static void main(String[] args) {// 目标对象UserDaoImpl2 target new UserDaoImpl2();// 代理对象IUserDao2 proxy (IUserDao2) DynamicProxyFactory.getProxyInstance(target);// 调用代理方法String result proxy.sayHello();System.out.println(result);} } 运行结果 before i am method named sayHello. by dynamic proxy after i am method named sayHello. by dynamic proxy 【3】cglib代理 1cglib定义 cglib 是一个强大、高性能和高质量的代码生成库。 它可以扩展 JAVA 类并在运行时实现接口 2特点 JDK的动态代理有一个限制就是使用动态代理的目标对象必须实现一个或多个接口。如果想目标对象不实现接口就可以使用CGLIB实现CGLIB是一个强大的高性能的代码生成包它可以在运行期扩展Java类与实现Java接口它广泛的被许多AOP的框架使用例如Spring AOP和dynaop为他们提供方法的 interception拦截CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM来转换字节码并生成新的类。不鼓励直接使用ASM因为它需要你对JVM内部结构包括class文件的格式和指令集都很熟悉 3cglib与动态代理最大的区别 使用动态代理的对象必须实现一个或多个接口使用cglib代理的对象则无需实现接口达到代理类无侵入 【3.1】cglib代理代码示例 1maven 引入 cglib 依赖 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.2.5/version/dependency 2没有实现接口的目标类 public class UserDaoImpl3 {public String sayHello() {String msg i am method named sayHello. test cglib proxy.;System.out.println(msg);return msg;} } 3代理工厂 public class CglibProxyFactory implements MethodInterceptor {private Object target;public CglibProxyFactory(Object target) {this.target target;}public Object getProxyInstance () {this.target target;// 工具类Enhancer enhancer new Enhancer();// 设置父类enhancer.setSuperclass(target.getClass());// 设置回调函数enhancer.setCallback(this);// 创建子类对象代理return enhancer.create();}Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(before);Object result method.invoke(target, args);System.out.println(after);return result;} } 4main方法 public class CglibProxyTest {public static void main(String[] args) {// 目标对象UserDaoImpl3 target new UserDaoImpl3();// 代理对象UserDaoImpl3 proxy (UserDaoImpl3) new CglibProxyFactory(target).getProxyInstance();// 调用代理方法String result proxy.sayHello();System.out.println(result);} } 执行结果 before i am method named sayHello. test cglib  proxy. after i am method named sayHello. test cglib  proxy. 【4】java代理实现小结 1静态代理 1.1实现较简单只要代理对象对目标对象进行包装即可实现增强功能但静态代理只能为一个目标对象服务如果目标对象过多则会产生很多代理类。1.2静态代理在编译时产生class字节码文件可以直接使用效率高。 2动态代理 2.1需要目标对象实现业务接口代理对象关联的调用处理类需要实现InvocationHandler接口。2.2动态代理必须实现InvocationHandler接口通过反射代理方法比较消耗系统性能但可以减少代理类的数量使用更灵活。 3cglib代理 无需实现接口通过生成类字节码实现代理比反射稍快不存在性能问题但cglib会继承目标对象需要重写方法所以目标对象不能为final类。【reference】 https://segmentfault.com/a/1190000011291179https://segmentfault.com/a/1190000011291179
http://www.zqtcl.cn/news/738899/

相关文章:

  • 本地郑州网站建设东莞网站优化中易
  • 动态域名可以建网站德州公司做网站
  • 深圳建设银行官方网站wordpress 添加qq
  • 甘肃第九建设集团公司网站网站对企业的好处
  • 论坛网站建设规划书公司网站建设与设计制作
  • 做棋牌游戏网站犯法吗如何进行搜索引擎的优化
  • 常见的网站首页布局有哪几种陈光锋网站运营推广新动向
  • 手机网站活动策划方案开一个设计公司
  • 宝塔建设网站教程visual studio 2010 网站开发教程
  • 做网站购买服务器做谷歌网站使用什么统计代码吗
  • 网站系统与网站源码的关系emlog轻松转wordpress
  • 网站的简介怎么在后台炒做吉林省住房城乡建设厅网站首页
  • 泉州易尔通网站建设国际酒店网站建设不好
  • 网页下载网站福田企业网站推广公司
  • 北京网站建设开发公司哪家好网站添加在线留言
  • 新建的网站怎么做seo优化平面广告创意设计
  • yy陪玩网站怎么做软件项目管理计划
  • 西安建网站价格低百度推广区域代理
  • 中英网站模板 照明公司注册在自贸区的利弊
  • 全球十大网站排名wordpress标题连接符
  • 网站开发可能遇到的问题四川建筑人才招聘网
  • 镇江网站托管怎么做淘宝网站赚钱吗
  • 交互式网站是什么知名vi设计企业
  • 上海个人做网站网站建设销售好做嘛
  • 邵阳建设网站哪家好手机网站栏目结构图
  • 做动车哪个网站查网站环境配置
  • 那些网站可以做h5国内新闻最新消息今天简短
  • asp网站开发实例河南省建设招投标网站
  • 营销型网站搭建公司有没有专做推广小说的网站
  • 汕头网站搭建wordpress文章列表摘要