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

江苏品牌网站设计工程建设业绩公示网站

江苏品牌网站设计,工程建设业绩公示网站,wordpress机械展示,怒江州建设局网站前言 作者在准备秋招中#xff0c;学习设计模式#xff0c;做点小笔记#xff0c;用宝可梦为场景举例#xff0c;有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 目录 前言代理模式1.情景模拟1.1静态代理优点局限 1.2 动态代理 2.应用3.局限4.解决方…前言 作者在准备秋招中学习设计模式做点小笔记用宝可梦为场景举例有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 目录 前言代理模式1.情景模拟1.1静态代理优点局限 1.2 动态代理 2.应用3.局限4.解决方案CGLIB踩坑注意!! 代理模式 代理模式是一种结构型设计模式。 对于代理模式其实不难理解就是甲乙双方在做一件事的时候有一个中间人作为代理。 甲委托代理代理和乙对接。生活中的例子就是租房、房东、中介的关系租房和房东作为甲乙双方通过中介完成业务。 在代码开发中代理模式主要用于控制对对象的访问通过中介避免调用者和提供方法的对象直接接触。 1.情景模拟 代理模式的主要抽象思路就是A和B的直接交互变为A和B通过C来交互。 在宝可梦没血的时候我们会选择对其进行治疗我们可以通过背包里的伤药(直接接触)或者宝可梦中心(通过代理)。 于是我们首先抽象出代理模式的第一个概念: Subject抽象主题——回血以及Real Subject真实主题——实现类 /*** 休息的地方* 提供回血方法*/ public interface Rest {void heal(); }/*** 回血的具体实现类*/ public class RestImpl implements Rest{Overridepublic void heal() {System.out.println(治疗...);} }宝可梦中心作为代理类自然要先懂得业务所以代理类也要实现对应的接口 /*** 静态代理类*/ public class PokemonCenterProxy implements Rest{// 被代理的角色private Rest rest;public PokemonCenterProxy(Rest rest) {this.rest rest;}Overridepublic void heal() {System.out.println(在宝可梦中心...);rest.heal();} }1.1静态代理 这样当主角(即程序调用者)想要回血的时候我们可以直接找到宝可梦中心(代理类) public class StaticProxyDemo {public static void main(String[] args) {// 真实主题RestImpl rest new RestImpl();// 传入代理类PokemonCenterProxy pokemonCenterProxy new PokemonCenterProxy(rest);// 代理类来执行方法pokemonCenterProxy.heal();} }在宝可梦中心... 治疗...优点 可以发现我们仍然调用了原有对象的heal()方法但是我们在此基础上完成了方法的扩展。 即我们在没有修改原有实现类的基础上实现了新增执行前后的动作的功能我们甚至可以 Overridepublic void heal() {System.out.println(在宝可梦中心...);rest.heal();System.out.println(按摩SPA);}可能大家看到这里就比较眼熟这不可以实现日志功能吗没错我们可以在方法执行前后织入另外的行为。 这样做的局限也很明显。 局限 从代理类的代码可以看出我提供了一个构造方法传入Rest接口的实现类这样避免了有新的实现类的时候要再写对应的新的静态代理类的情况。 这样做的问题在于我们仍然把被代理类给暴露出来了仍然要先new一个Rest的实现类。 其次如果Rest接口的方法增多作为继承了接口的静态代理类仍要实现每个方法可能之间有大量的冗余代码。 所以要解决以上局限动态代理是个更好的选择。 1.2 动态代理 Java对动态代理提供了支持。 要实现动态代理第一步是实现内置的InvocationHandler接口重写Invoke方法 public class DynamicProxy implements InvocationHandler {private Rest rest;public DynamicProxy(Rest rest) {this.rest rest;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(进入宝可梦中心);Object invoke method.invoke(rest, args);System.out.println(售后服务);return invoke;} }基于反射程序在运行途中获得了类的方法(invoke的参数中的method)方法的参数等信息。 被代理的类运行的所有方法都被替换为这个invoke方法真正执行原方法的逻辑是在method.invoke(rest, args); 所以这一行的前后就可以写代理类在执行方法之前/之后的逻辑。 public class DynamicProxyDemo {public static void main(String[] args) {// 需要被代理的对象Rest rest new RestImpl();// 以此创建代理类DynamicProxy dynamicProxy new DynamicProxy(rest);ClassLoader classLoader rest.getClass().getClassLoader();Rest o (Rest) Proxy.newProxyInstance(classLoader, new Class[]{Rest.class}, dynamicProxy);o.heal();} }动态代理的核心就在于Proxy类在动态代理中创建真实对象的实例是通过Proxy的newProxyInstance方法。 其参数有三 类加载器接口类的类加载器直接调用api获取实现的接口的数组: new Class[]{...}是创建数组并赋值的语法里面传入要实现的接口的类对象实现了InvocationHandler的对象用来执行逻辑 然后用Proxy类创建出的对象调用方法就可以实现代理类中实现的逻辑无论Rest接口有多少方法我们都不需要一一去实现。 相应地有新业务接口的时候也不用新增代理类。除非你有不同的代理逻辑(即invoke方法里的逻辑)否则都不需要新增代码。 运行结果 进入宝可梦中心 治疗... 售后服务2.应用 Spring框架中AOP就是基于动态代理以此来实现一种切面逻辑。 应用场景包括日志记录、权限控制。 3.局限 通过Proxy类来实现动态代理有一个最主要的局限只能代理接口类。 并且通过反射来实现的性能开销比较大。 4.解决方案CGLIB 通过CGLIB实现动态代理。CGLIB可以实现对类的动态代理并且实现原理是生成新的字节码类。 第一步引入依赖 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version /dependency第二部写要代理的类这里可以不是接口了 public class Heal {public void heal(){System.out.println(HP);} }第三步创建代理类 import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class MyMethodInterceptor implements MethodInterceptor {Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {// 代理逻辑System.out.println(Pre);Object o1 methodProxy.invokeSuper(o, objects);System.out.println(Suf);return o1;} }第四步创建代理对象 public class Demo {public static void main(String[] args) {// 创建Enhancer类类似于Proxy类Enhancer enhancer new Enhancer();// 设置目标类enhancer.setSuperclass(Heal.class);// 设置拦截器enhancer.setCallback(new MyMethodInterceptor());// 创建代理对象Heal proxy (Heal)enhancer.create();// 执行原有方法proxy.heal();} }踩坑注意!! 如果跟我一样用的Java17, 那么运行的时候会出现: Exception in thread main java.lang.ExceptionInInitializerErrorat com.example.springbootdemo.proxyCglib.Demo.main(Demo.java:7) Caused by: net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException--Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not opens java.lang to unnamed module 14899482at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:464)at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:339)at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:96)at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:94)at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:119)at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:294)at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:221)at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:174)at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:153)at net.sf.cglib.proxy.Enhancer.clinit(Enhancer.java:73)... 1 more解决方法和原因: https://blog.csdn.net/guoshengkai373/article/details/127319933 只能换到低版本的JDK我试过把CGLIB依赖版本弄到最新也没用。
http://www.dnsts.com.cn/news/246423.html

相关文章:

  • 网上接单做效果图哪个网站好上海app开发定制公司
  • 做网站是什么公司公司产品宣传画册设计
  • 网站建设与维护实验心得物联网开发
  • 室内装修设计网站推荐cms网站系统
  • 网站description县网站建设方案
  • 做网站贵吗高端建站什么意思
  • php网站建设费用网站做任务包括什么
  • 企业网站建设一般包含哪些内容wordpress部分密码
  • 查找南宁网站开发公司濮阳做网站的公司有哪些
  • 深圳那家做APP网站的最好温岭网站建设制作
  • 国内做的好的帽子网站大连网站建设免费
  • 网站换了域名怎么查进入官网登录页面
  • 网站快照诊断指数函数和对数函数
  • 手机如何做网站企业集团网站建设与运营
  • 监控视频做直播网站门户网站建设厂商名录
  • wordpress版本信息在哪里查看资阳优化团队预订
  • 网站怎样做排名自学网官网
  • 临安做网站的公司有哪些建设银行网站201308
  • 做首图的网站河北沧州做网站的电话
  • 上海企业网站设计公司电话织梦网站下载地址
  • 东莞网站建设lhznkj网站建设好还是阿里巴巴好
  • 网站维护收费标准网站建设确认报告
  • 网站开发与网站制作个人网站制作成品
  • html5网站源码php目前网络推广平台
  • 商标 做网站 是几类做软装设计找图有什么好的网站
  • 福建大佳建设工程有限公司网站医生做兼职有什么网站吗
  • 炽乐清网站建设wordpress国内打开速度慢
  • 网站描述和关键词怎么写网站建设的主要技术路线
  • 做系统之前的网站百货店怎么做网站送货
  • 上海外贸界龙彩印有限公司seo怎样