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

自己做的网站怎么设置关键词长汀网站建设

自己做的网站怎么设置关键词,长汀网站建设,凯天建设发展集团有限公司网站,外贸平台有哪些小网站文章目录 一、代理模式基础1.1 代理模式1.2 静态代理1.3 动态代理 二、静态代理的实现三、JDK动态代理3.1 JDK动态代理概述3.2 invoke方法介绍3.3 JDK动态代理的使用 四、CGLIB动态代理3.1 CGLIB动态代理概述3.2 CGLIB动态代理的使用 五、对比5.1 代理实现与使用对比5.2 使用条… 文章目录 一、代理模式基础1.1 代理模式1.2 静态代理1.3 动态代理 二、静态代理的实现三、JDK动态代理3.1 JDK动态代理概述3.2 invoke方法介绍3.3 JDK动态代理的使用 四、CGLIB动态代理3.1 CGLIB动态代理概述3.2 CGLIB动态代理的使用 五、对比5.1 代理实现与使用对比5.2 使用条件对比5.3 增强逻辑的位置对比 一、代理模式基础 1.1 代理模式 代理模式是常见的设计模式之一代理模式就是代理对象具备真实对象的功能能代替真实对象完成相应操作并能在操作执行的前后进行增强处理。 代理模式常应用于面向切面编程(AOP)、日志记录、权限控制、性能监控等多种横切关注点的系统级服务。 代理模式的实现可以分为两类一类是静态代理另一类是动态代理。 1.2 静态代理 静态代理在程序运行前就已经存在指由程序员需要手动编写或使用特定工具生成代理类的源代码即.class 文件在程序编译阶段就已确定。 静态代理需要为每个目标类手动编写代理类可能导致代码重复。适用于代码结构相对固定且代理类数量有限的场景。 1.3 动态代理 动态代理是在程序运行期间动态生成的。代理不是直接写成 .class 文件而是在JVM运行时通过反射、字节码操作如Java的 java.lang.reflect.Proxy 类或第三方库如CGLIB等机制动态构建的。 动态代理提供了更高的灵活性和扩展性但会牺牲少许性能。 二、静态代理的实现 先理解静态代理的实现更容易理解JDK动态代理的原理其使用流程如下 定义一个接口里面有需要被代理/增强的方法。定义一个需要被代理的类实现上述接口。定义一个静态代理类也实现上述接口并且需要定义接口类型的成员变量用于指向被代理的对象。在静态代理类中可以对接口方法进行增强内部可以调用被代理对象的对应方法并在前后做增强处理。使用时用接口申明变量类型指向静态代理类的实例对象。 // 接口 interface Subject {// 需要被增强的方法void request(); }// 实现类 class RealSubject implements Subject {Overridepublic void request() {System.out.println(RealSubject: Handling request.);} }// 静态代理类 class StaticProxy implements Subject {// 成员变量用于指向被代理的对象使用接口类型申明该变量private final Subject realSubject;// 可以用构造器或者set方法来设置被代理的对象public StaticProxy(Subject realSubject) {this.realSubject realSubject;}Overridepublic void request() {// 可选的前置处理preRequest();// 调用被代理的对象realSubject.request();// 可选的后置处理postRequest();}private void preRequest() {System.out.println(StaticProxy: Pre-processing request.);}private void postRequest() {System.out.println(StaticProxy: Post-processing request.);} }// 使用静态代理对象 public class StaticProxyTest {public static void main(String[] args) {// 使用接口申明变量类型指向静态代理类的实例对象Subject subject new StaticProxy(new RealSubject());subject.request();} }三、JDK动态代理 3.1 JDK动态代理概述 JDK动态代理是一种利用Java反射机制在运行时动态创建代理对象的技术它是Java原生支持的主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 JDK 动态代理基于接口只有实现了接口的类才能通过 JDK 动态代理来增强接口方法。 3.2 invoke方法介绍 Object proxy代理对象的引用。尽管在invoke方法内部可能不需要直接使用它但它代表了代理实例本身有时候可用于获取代理类的信息或其他特殊处理。Method method表示被调用的方法的一个Method对象。这个对象包含了方法的所有元数据如方法名、返回类型、参数类型等。你可以利用这个对象来判断被调用的是哪个具体方法从而做出不同的处理逻辑。Object[] args一个对象数组包含了调用方法时传递的实际参数。这些参数与原始方法调用时提供的参数类型和顺序完全一致。你可以利用这些参数来传递给被代理方法或者进行预处理/后处理返回值invoke方法的返回值会作为实际调用方法的返回值。 3.3 JDK动态代理的使用 JDK动态代理的使用流程如下 定义一个接口里面有需要被代理/增强的方法。定义一个需要被代理的类实现上述接口。定义一个动态代理处理器需要实现InvocationHandler接口并且需要定义接口类型的成员变量用于指向被代理的对象。实现invoke()方法可以对接口方法进行增强。使用时用接口申明变量类型指向Proxy.newProxyInstance()返回的代理对象。 // 动态代理处理器 class DynamicProxyHandler implements InvocationHandler {private final Subject realSubject;public DynamicProxyHandler(Subject realSubject) {this.realSubject realSubject;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {preRequest();// 调用被代理对象的方法// 调用接口方法时这里就会调用被代理对象的相应方法Object result method.invoke(realSubject, args);postRequest();return result;}private void preRequest() {System.out.println(DynamicProxyHandler: Pre-processing request.);}private void postRequest() {System.out.println(DynamicProxyHandler: Post-processing request.);} }// 测试动态代理 public class DynamicProxyTest {public static void main(String[] args) {Subject realSubject new RealSubject();// 返回的是Object对象需要转换为目标接口对象Subject proxySubject (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),new Class[]{Subject.class},new DynamicProxyHandler(realSubject));proxySubject.request();} }四、CGLIB动态代理 3.1 CGLIB动态代理概述 CGLIBCode Generation Library是一个强大的、高性能的代码生成库它允许在运行时动态地生成和修改Java字节码。 CGLIB动态代理基于子类继承能够对任何类无论是否实现了接口实现代理这使得它的应用范围更广。 3.2 CGLIB动态代理的使用 CGLIB动态代理的使用流程如下 定义目标类无需实现接口。定义方法拦截器需要实现MethodInterceptor接口。实现intercept()方法来对被代理对象的方法进行增强。使用时需要创建方法拦截器对象和Enhancer对象通过Enhancer对象来返回代理对象。该操作可以封装在方法拦截器中。 // 目标类无需实现接口 class RealSubject {public void request() {System.out.println(RealSubject: Handling request.);} }// CGLIB代理实现 class CglibProxy implements MethodInterceptor {Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {preRequest();Object result proxy.invokeSuper(obj, args); // 调用父类方法即真实对象的方法postRequest();return result;}private void preRequest() {System.out.println(CglibProxy: Pre-processing request.);}private void postRequest() {System.out.println(CglibProxy: Post-processing request.);}// 创建代理对象public Object getProxy(Class? clazz) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(clazz); // 设置父类enhancer.setCallback(this); // 设置回调方法return enhancer.create(); // 创建并返回代理对象} }// 测试CGLIB动态代理 public class CglibProxyTest {public static void main(String[] args) {CglibProxy cglibProxy new CglibProxy();// 返回的是Object对象需要转换为被代理类的对象RealSubject proxySubject (RealSubject) cglibProxy.getProxy(RealSubject.class);proxySubject.request();} }五、对比 5.1 代理实现与使用对比 实现代理逻辑 都需要调用目标方法然后在目标方法前后新增增强逻辑。区别是静态代理在实现接口方法时调用被代理对象的目标方法并实现增强。动态代理需要实现接口InvocationHandler / MethodInterceptor必须实现接口方法invoke / intercept在接口方法里调用被代理对象的目标方法并实现增强。 获取代理对象 静态代理时被代理类的对象即代理对象。 JDK动态代理中使用Proxy.newProxyInstance()来获取代理对象。 CGLIB动态代理中使用enhancer.create()来获取代理对象。 5.2 使用条件对比 静态代理和CGLIB动态代理都依赖于接口CGLIB动态代理不依赖于接口。 5.3 增强逻辑的位置对比 静态代理中增强逻辑分散在被代理类的各个方法中需要在方法中实现该方法的增强逻辑。如果这些方法都需要同种增强将产生大量的重复代码。 在动态代理中增强逻辑集中在一个方法里。如果所有方法都需要同种增强增强逻辑只需要写一处非常方便。如果方法的增强逻辑不同则需要通过反射获取方法名然后使用响应的增强逻辑。
http://www.dnsts.com.cn/news/245209.html

相关文章:

  • 做门窗网站南京网站建设咨询
  • 建网站培训机构天津网站建设找哪家
  • 简洁游戏企业网站漳州公司建设网站
  • 如何做淘宝二手网站权威发布海报
  • 山西免费网站建设百度智能小程序
  • 杏坛网站建设wordpress插件中文网
  • 秦皇岛网站关键词网页制作与网站开发 实验报告
  • 各地网站备案做网站要用什么语言
  • 旅游 网站建设个人网站做外链方法
  • 做壁纸壁的网站有什么福州 网站建设价格
  • 深圳坪山网站制作公司网站推广营销的意义
  • 网站里 动效是用什么做的个人备案的网站能做什么
  • 网站怎么做能让人搜到设计医院网站建设
  • 深圳苏州企业网站建设服务商细谈电商网站外链建设的策略
  • 恶意镜像网站程序上海企业信息查询公示系统
  • 网站建设需要懂什么语言百度推广怎么收费标准案例
  • 万网虚拟云空间怎么建设网站网站建设 海口
  • 瑞典网站后缀高德地图vr全景怎么打开
  • 自做业务网站广州网站优化渠道
  • windows.net做网站广东省住房和城乡建设厅官网查证
  • 流媒体 网站开发写软文的平台有哪些
  • 个人网站示例做淘宝客网站域名是别人的
  • 湖州城市投资建设集团网站Godaddy优惠码网站怎么做的
  • 上海 网站撤销备案免费做淘宝客网站有哪些
  • 网站排名优化的技巧广州免费领养猫咪
  • 做网站法人拍照背景做视频网站要什么
  • 报考建设八大员官方网站凡科网营销推广
  • 网站建设后台系统有哪些少儿编程培训
  • 常州高端网站制作公司排名网站开发赚钱吗 知乎
  • html5手机企业网站模板购买了域名之后怎么做网站