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

呼和浩特市城乡建设委员会网站各种网站

呼和浩特市城乡建设委员会网站,各种网站,网站群的建设策略,政府机关网站制作典型回答 反射机制是 Java 语言提供的一种基本功能,赋予程序在运行时 自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法&#xff…

典型回答

反射机制是 Java 语言提供的一种基本功能,赋予程序在运行时 自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。

实现动态代理的方式很多,比如 JDK 自身提供的公台代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist等。

知识扩展

关于反射

要想知道什么是反射,就需要先来了解什么是“正射”。一般情况下,我们在使用某个类之前已经确定它到底是个什么类了,拿到手就直接可以使用 new 关键字来调用构造方法进行初始化,之后使用这个类的对象来进行操作。

Writer writer = new Writer();
writer.setName("迈克尔.杰克驴");

像上面这个例子,就可以理解为“正射”。
而反射就意味着一开始我们不知道要初始化的类到底是什么,也就没法直接使用 new 关键字创建对象了。

我们只知道这个类的一些基本信息,就好像我们看电影的时候,为了抓住一个犯罪嫌疑人,警察就会问一些目击证人,根据这些证人提供的信息,找专家把犯罪嫌疑人的样貌给画出来——这个过程,就可以称之为反射。

Class clazz = Class.forName("com.itwanger.s39.Writer");
Method method = clazz.getMethod("setName", String.class);
Constructor constructor = clazz.getConstructor();
Object object = constructor.newInstance();
method.invoke(object,"迈克尔.杰克驴");

像上面这个例子,就可以理解为“反射”。
反射的成本是要比正射的高得多。反射的缺点主要有两个。

  • 破坏封装:由于反射允许访问私有字段和私有方法,所以可能会破坏封装而导致安全问题。
  • 性能开销:由于反射涉及到动态解析,因此无法执行 Java 虚拟机优化,再加上反射的写法的确要复杂得多,所以性能要比“正射”差很多,在一些性能敏感的程序中应该避免使用反射。

反射的主要应用场景:

  • 开发通用框架:像Spring ,为了保持通用性,通过配置文件来加载不同的对象,调用不同的方法。
  • 动态代理:在面向切面编程中,需要拦截特定的方法,就会选择动态代理的方式,而动态代理的底层技术就是反射。
  • 注解:注解本身只是起到一个标记符的作用,它需要利用发射机制,根据标记符去执行特定的行为。

关于动态代理

代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。

为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。
在这里插入图片描述
你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。

在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现: 比如类可能是第三方封闭库的一部分。

解决方案

代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。
在这里插入图片描述
代理将自己伪装成数据库对象, 可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。

这有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。

真实世界类比
在这里插入图片描述
信用卡是银行账户的代理, 银行账户则是一大捆现金的代理。 它们都实现了同样的接口, 均可用于进行支付。 消费者会非常满意, 因为不必随身携带大量现金; 商店老板同样会十分高兴, 因为交易收入能以电子化的方式进入商店的银行账户中, 无需担心存款时出现现金丢失或被抢劫的情况。

代理模式结构

在这里插入图片描述

什么是动态代理

使用 jdk 的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。

动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。

jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理
在这里插入图片描述

动态代理解决了什么问题?

通过代理可以让调用者与实现者之间解耦。比如进行 RPC 调用,框架内部的寻址、序列化、反序列化等,对于调用者往往是没有太大意义的,通过代理,可以提供更加友善的界面。

利用动态代理机制,相应的 stub 等类,可以在运行时生成,对应的调用操作也是动态完成,极大地提高了我们的生产力。

JDK 动态代理在设计和实现上与 cglib 等方式有什么不同,进而如何取舍?

JDK Proxy 的优势:

  • 最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠。
  • 平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。
  • 代码实现简单。

基于类似 cglib 框架的优势:

  • 有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。
  • 只操作我们关心的类,而不必为其他相关类增加工作量。
  • 高性能。

我们在选型中,性能未必是唯一考量,可靠性、可维护性、编程工作量等往往是更主要的考虑因素,毕竟标准类库和反射编程的门槛要低得多,代码量也是更加可控的,如果我们比较下不同开源项目在动态代理开发上的投入,也能看到这一点。

http://www.hengruixuexiao.com/news/16501.html

相关文章:

  • 网上帮别人做网站海外推广渠道
  • APP和网站是一样吗小红书关键词排名
  • seo流量排名门户潍坊百度快速排名优化
  • 温州网站建设方案书2023年10月疫情恢复
  • 禹州网站建设电商seo引流
  • 徐州市专业做网站的公司如何给公司网站做推广
  • 合肥 电子商务 网站建设cfa一级看多久两分钟
  • 网站建设服务公域名注册网站系统
  • 深圳注册公司个人数字证书什么是seo如何进行seo
  • 建设一个自己的网站首页电商网站建设 网站定制开发
  • 营销网站建设套餐网站点击率查询
  • 分享代码的网站app开发成本预算表
  • 网站建设四步骤网络营销主要特点有哪些
  • 建站哪家好联系兴田德润自助建站系统模板
  • 买域名自己做网站nba最快的绝杀
  • 青岛网站建设公司排名厦门seo网站管理
  • wordpress站点后台seo外包公司报价
  • 上海做网站费用友情链接怎么互换
  • 峰峰企业做网站推广百度登录个人中心官网
  • 自己怎么创建网站石家庄最新消息
  • 做外贸哪个网站比较好2017朋友圈软文
  • dw做静态网站网络营销案例分析题及答案
  • 如何判断一个网站是php还是asp打广告去哪个平台
  • 做视频网站把视频放在哪里最成功的网络营销案例
  • 江西萍乡做网站公司竞价推广账户竞价托管费用
  • 企业网站备案java成品网站
  • 做移动网站优化优seo优化自动点击软件
  • 四川城乡建设厅建筑特种作业证书seo教程搜索引擎优化入门与进阶
  • 素材设计做的好的网站有哪些企业品牌推广网站
  • 郑州见效果付费优化公司seo技术306