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

吉林省城乡建设厅网站6网络服务商不提供哪项服务

吉林省城乡建设厅网站6,网络服务商不提供哪项服务,网站模板安装好后,如何修改wordpress站名在Java开发中#xff0c;动态代理是一种强大的机制#xff0c;它允许我们在运行时创建代理对象#xff0c;从而在不修改原有代码的情况下#xff0c;对目标对象的方法进行增强。这种技术在AOP#xff08;面向切面编程#xff09;、RPC#xff08;远程过程调用#xff0… 在Java开发中动态代理是一种强大的机制它允许我们在运行时创建代理对象从而在不修改原有代码的情况下对目标对象的方法进行增强。这种技术在AOP面向切面编程、RPC远程过程调用、ORM对象关系映射等领域有着广泛的应用。Java中实现动态代理主要有两种方式JDK动态代理和CGLIB动态代理。 一、JDK动态代理 1. 原理 JDK动态代理是Java语言自带的代理实现方式它基于Java的反射机制。当使用JDK动态代理时代理类会实现目标对象所实现的接口并在运行时动态生成。其核心在于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类负责创建代理对象而InvocationHandler接口则定义了代理对象的方法调用逻辑。当代理对象的方法被调用时实际会转发到InvocationHandler的invoke方法我们可以在invoke方法中对目标方法进行增强。 2. 特点 基于接口 JDK动态代理只能代理实现了接口的类。如果目标对象没有实现任何接口则无法使用JDK动态代理。运行时生成 代理类在运行时动态生成并加载到JVM中。性能 在Java 8及以前的版本中JDK动态代理的性能通常低于CGLIB。但在Java 9及以后的版本中由于JVM对动态代理的优化其性能已有所提升甚至在某些场景下可以超越CGLIB。安全性 由于是Java原生支持相对更安全。 3. 适用场景 JDK动态代理适用于目标对象实现了接口的场景。例如Spring AOP在默认情况下会优先使用JDK动态代理来为实现了接口的Bean创建代理。 4. JDK动态代理示例 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;// 定义一个接口 interface UserService {void sayHello(String name); }// 实现接口的类 class UserServiceImpl implements UserService {Overridepublic void sayHello(String name) {System.out.println(Hello, name from UserServiceImpl);} }// 代理处理器 class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(Before method: method.getName());Object result method.invoke(target, args);System.out.println(After method: method.getName());return result;} }public class JdkProxyDemo {public static void main(String[] args) {UserService userService new UserServiceImpl();UserService proxy (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),new MyInvocationHandler(userService));proxy.sayHello(World);} }二、CGLIB动态代理 1. 原理 CGLIBCode Generation Library是一个强大的、高性能的字节码生成库。它可以在运行时扩展Java类和实现Java接口。CGLIB动态代理的原理是通过继承目标类来创建代理类。它使用ASM一个Java字节码操作框架来修改字节码生成目标类的子类并在子类中重写父类的方法从而实现方法的增强。当代理对象的方法被调用时会通过CGLIB生成的代理类来调用并执行我们定义的增强逻辑。 2. 特点 基于类 CGLIB动态代理可以代理没有实现接口的类。它通过继承目标类来实现代理因此目标类不能是final类因为final类无法被继承。运行时生成 代理类在运行时动态生成并加载到JVM中。性能 在Java 8及以前的版本中CGLIB通常比JDK动态代理具有更好的性能因为它直接操作字节码避免了反射的开销。但在Java 9及以后的版本中JDK动态代理的性能已有所提升两者的性能差距逐渐缩小。侵入性 相对于JDK动态代理CGLIB对目标类有一定的侵入性因为它需要继承目标类。 3. 适用场景 CGLIB动态代理适用于目标对象没有实现接口的场景或者需要代理final方法以外的任何方法。Spring AOP在目标Bean没有实现接口时会使用CGLIB动态代理。 4. CGLIB动态代理示例 首先确保你的项目中引入了CGLIB的依赖 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version /dependencyimport net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;// 没有实现接口的普通类 class ProductService {public void getProduct(String id) {System.out.println(Getting product with ID: id);} }// 代理拦截器 class MyMethodInterceptor implements MethodInterceptor {Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(Before method: method.getName());Object result proxy.invokeSuper(obj, args);System.out.println(After method: method.getName());return result;} }public class CglibProxyDemo {public static void main(String[] args) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(ProductService.class);enhancer.setCallback(new MyMethodInterceptor());ProductService proxy (ProductService) enhancer.create();proxy.getProduct(123);} }三、JDK与CGLIB对比 特性JDK动态代理CGLIB动态代理代理方式基于接口基于类继承限制只能代理实现了接口的类不能代理final类和final方法性能Java 8及以前版本通常低于CGLIBJava 9有所提升Java 8及以前版本通常优于JDKJava 9性能差距缩小侵入性无侵入性对目标类有侵入性继承原生支持Java原生支持第三方库支持 四、动态代理选择建议 在实际项目中选择JDK动态代理还是CGLIB动态代理主要取决于以下几个因素 目标对象是否实现接口 如果目标对象实现了接口并且你希望通过接口进行代理那么JDK动态代理是首选。它简单、直接并且是Java原生支持的。如果目标对象没有实现接口或者你希望代理的是一个普通的类那么CGLIB动态代理是唯一的选择。 性能要求 在大多数业务场景下JDK和CGLIB的性能差异可以忽略不计。如果对性能有极致要求并且在Java 8及以前的版本中可以考虑CGLIB。但在Java 9及以后的版本中建议进行实际测试因为JDK动态代理的性能已大幅提升。 框架选择 许多主流框架如Spring会根据情况自动选择合适的代理方式。例如Spring AOP在默认情况下如果目标对象实现了接口则使用JDK动态代理否则使用CGLIB动态代理。你也可以通过配置来强制指定代理方式。 final类和final方法 如果目标类是final的或者需要代理的方法是final的那么CGLIB动态代理将无法工作因为CGLIB通过继承来实现代理而final类和final方法不能被继承或重写。在这种情况下你可能需要重新考虑设计或者寻找其他代理方案。 五、结论 JDK动态代理和CGLIB动态代理各有优劣它们在Java生态系统中扮演着重要的角色。JDK动态代理是Java语言的内置功能适用于基于接口的代理而CGLIB则是一个强大的第三方库适用于基于类的代理。在选择时应根据目标对象的特性、性能要求以及所使用的框架等因素进行综合考量。
http://www.hkea.cn/news/14443678/

相关文章:

  • 怎么做付款下载网站wordpress改密码忘记
  • 做网站先学美工登陆建设银行官方网站
  • 有什么网站用名字做图片大全asp技术做网站
  • 网站要多少钱互联网营销公司排行榜
  • 网站 图片切换徐州企业网站排名优化
  • 做网站前端用什么技术好wordpress 网站登录
  • 营销型网站建设实训总结WordPress让中文名图片显示
  • 哪里有网站开发设计中国四大门户网站分别是
  • 做照片书的模板下载网站好南岸集团网站建设
  • 布吉做网站的公司本地网站建设电话
  • 做红酒闪购的网站有哪些小程序免费制作平台登录
  • 上合建设网站企业品牌网站建设k小蝌蚪
  • 设计网页公司哪里好seo大牛
  • 什么事网站建设wordpress密码忘记了
  • 在哪注册网站丽江市企业网站
  • 常州的网站建设北京学会网站建设
  • 众筹网站搭建软件工程学科评估排名
  • 长沙传媒公司招聘深圳网站优化软件
  • 做网站教程流程哈尔滨网站推广
  • 酒店做网站企业解决方案平台
  • 网站架构方案苏州做网站优化的
  • 兰州网站排名推广迅捷在线图片编辑
  • wordpress snape莱芜网站优化有哪些
  • ftp如何备份网站手机网站开发环境
  • 校园网站首页模板wordpress图片在哪
  • 大学网站建设招标方案美橙互联网站建设进不去
  • 长沙营销型网站中公教育培训机构官网
  • 网站建设佛山网址短链接在线生成免费
  • 丹阳市住房建设管理局网站徐州低价seo
  • 外贸自主建站平台有什么网站用名字做图片