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

北京网站设计公司hlh成都柚米科技15重庆旅游景点

北京网站设计公司hlh成都柚米科技15,重庆旅游景点,域名注册好如何做网站,wordpress 原创主题前言 Java代理模式是一种设计模式#xff0c;在 Java 开发中被广泛应用。它允许我们通过添加一个代理对象来控制对另一个对象的访问#xff0c;从而提供了一种间接访问实际对象的方法。 代理模式可以分为静态代理和动态代理两种。静态代理是在代码实现阶段就确定了代理…前言        Java代理模式是一种设计模式在 Java 开发中被广泛应用。它允许我们通过添加一个代理对象来控制对另一个对象的访问从而提供了一种间接访问实际对象的方法。 代理模式可以分为静态代理和动态代理两种。静态代理是在代码实现阶段就确定了代理类与目标类之间的关系而动态代理是在运行时动态生成代理类。在Java中使用反射机制来实现动态代理。 静态代理的例子包括创建一个接口和一个实现该接口的类然后创建一个代理类该代理类实现了相同的接口并包含目标对象。代理类可以在不修改目标对象的前提下扩展目标对象的功能但这种方法可能会产生冗余的代理类不易维护且一旦接口增加方法目标对象与代理对象都要进行修改。 动态代理则是在程序运行过程中产生的代理对象它通过反射机制生成。在Java中可以使用java.lang.reflect包下的Proxy类和一个InvocationHandler接口来生成动态代理对象。这种方式可以针对接口做代理而不需要在编译时实现代理类。 1. 静态代理 静态代理在使用时需要定义接口或者父类被代理对象与代理对象一起实现相同的接口或者是继承相同父类。 /*** 代理对象静态代理* */ public class Proxy01 implements UserDao {//接受保存目标对象UserDao target;public Proxy01() {}public Proxy01(UserDao target) {this.target target;}Overridepublic void getUser() {System.out.println(获取user开始);target.getUser();System.out.println(获取user结束);} } public class Proxy01_test {public static void main(String[] args) {//目标对象UserDao target new UserDaoImpl();//代理对象,把目标对象传给代理对象,建立代理关系Proxy01 proxy new Proxy01(target);//执行的是代理的方法proxy.getUser();} } 当客户端调用代理类的方法时代理类会通过目标对象来真正执行计算操作。在代理类的方法前或方法后可以添加一些额外的操作例如日志记录、性能监控等。 总结 静态代理在使用时需要定义接口或者父类被代理对象与代理对象一起实现接口或继承相同 的父类 缺点 因为代理对象需要和被代理对象实现相同的接口或父类所以会有太多的代理类一旦接口中增加了方法后被代理对象和代理对象都需要维护非常麻烦不方便 2.动态代理 动态代理是一种更加灵活和高效的代理模式它可以在运行时动态生成代理类避免了手动编写大量代理类的繁琐工作。在 Java 中动态代理主要有两种实现方式JDK 动态代理和 CGLIB 动态代理。 2.1 JDK 动态代理 JDK 动态代理是 Java 标准库提供的一种动态代理实现方式它基于接口代理实现。在 JDK 动态代理中我们需要通过 java.lang.reflect.Proxy 类来生成代理对象。 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;class CalculatorInvocationHandler implements InvocationHandler {private final Object target;public CalculatorInvocationHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method.getName() 执行方法前...);Object result method.invoke(target, args);System.out.println(method.getName() 执行方法后...);return result;} }public class JdkMain {public static void main(String[] args) {Calculator calculator new RealCalculator();CalculatorInvocationHandler handler new CalculatorInvocationHandler(calculator);Calculator proxy (Calculator) Proxy.newProxyInstance(calculator.getClass().getClassLoader(),calculator.getClass().getInterfaces(),handler);int a 1, b 2;System.out.println(add: proxy.add(a, b));System.out.println(sub: proxy.sub(a, b));System.out.println(mul: proxy.mul(a, b));System.out.println(div: proxy.div(a, b));} }我们定义了一个 CalculatorInvocationHandler 类来实现 java.lang.reflect.InvocationHandler 接口。当客户端调用代理对象的方法时JDK 动态代理会自动调用 invoke 方法并将目标对象方法的调用转发给 RealCalculator 对象。在 invoke 方法前或方法后我们可以添加一些额外的操作例如日志记录、性能监控等。 总结 代理对象不需要实现接口但是目标对象一定要实现接口否则不能用动态代理。 2.2 Cglib动态代理 Cglib动态代理是一种不基于接口的动态代理实现方式它可以代理没有实现接口的类。在 Cglib动态代理中我们需要通过 net.sf.cglib.proxy.Enhancer 类来生成代理对象。 没有实现任何接口的类 public class UserService {public void addUser(String username, String password) {System.out.println(add user: username , password);}public void updateUser(String username, String password) {System.out.println(update user: username , password);}public void deleteUser(String username) {System.out.println(delete user: username);} }使用 Cglib动态代理来生成代理对象 import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;class UserServiceInterceptor implements MethodInterceptor {Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(method.getName() 执行方法前);Object result proxy.invokeSuper(obj, args);System.out.println(method.getName() 执行方法后);return result;} }public class CglibMain {public static void main(String[] args) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallback(new UserServiceInterceptor());UserService proxy (UserService) enhancer.create();proxy.addUser(Tom, 123456);proxy.updateUser(Tom, tom123456);proxy.deleteUser(Tom);} }Cglib子类代理需要注意的是: 需要引入cglib的jar包代理的类不能是final否则报错目标对象的方法如果有final/static那么不会被拦截即不会执行目标对象额外的业务方法。 Cglib代理也叫作子类代理它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。Cglib是一个强大的高性能的代码生成包它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用为其提供方法的interception(拦截)例如大家所熟知的Spring AOP。
http://www.pierceye.com/news/995648/

相关文章:

  • 类似 wordpress 建站哪里有培训班
  • 广州建设六马路小学网站微营销软件免费下载
  • 广州网站推广解决方案网站建设标志头像图片
  • 网站建设 中企动力成都qq空间wordpress
  • 什么是定制网站php网站开发面试
  • 网站建设推广专家服务重庆万泰建设集团有限公司
  • 2017两学一做竞赛网站手游游戏推广平台
  • 贵州灵溪seo整站优化wordpress开发文档(chm)
  • iis7 网站权限设置亚马逊网站开发设计
  • 贵阳做网站哪家好复古网站设计
  • 网站跳转是什么意思58这样网站怎么做
  • 易语言网站批量注册怎么做百度模板网站模板
  • 海伦市网站山西大川建设有限公司网站
  • 快速搭建网站域名绑定设置网站优化是往新闻中心发新闻吗
  • 复刻手表网站公众号快速涨10000粉丝方法
  • 珠海网站系统建设项目制作网页的网站推荐
  • 做网站公司怎么选宁波外贸公司排行
  • 在因特网上建设网站可选择的方案网络营销实际上就是网上营销
  • 网站建设思路梳理wordpress 修改数据库表
  • 定制建站橱柜企业网站模板
  • 做网站js框架施工企业三金压降指的是哪三金
  • 现在建设一个网站需要什么技术网页设计素材推荐
  • 大寺网站建设公司虚拟机可以做多个网站
  • 网站更新文章承德信息网
  • 做平面图片的网站网络钟点工
  • 网站的功能板块古镇中小企业网站建设
  • cms网站访问人数wordpress 修改网址
  • 万州网站推广1688拿货网
  • 西部数码做网站企业建设官方网站的目的
  • 做什么网站小程序网站开发怎么样