设计模式

Java动态代理的异常处理问题

今天在使用Java动态代理时出现了一个很棘手的问题,实现类里抛出了一个自定义异常,但外面捕获不到。 虽然使用printStack可以输出调试信息,但通过getMessage获取不到提示,因为项目需求是捕捉到同一种自定义异常的不同异常情况,通过 getMessage获取异常提示反馈给用户,但因为使用了动态代理所以出现了异常捕获不到的情况。 具体原因是因为我们通过动态代理最终捕获到的异常时经过加工了的,也就是捕获的已不再是最开始我们希望抛出的异常,加工抛出的异常有两种: java.lang.reflect.UndeclaredThrowableException java.lang.reflect.InvocationTargetException 经过实验,最终的解决办法为: 在动态代理的方法执行时捕获异常,然后抛出exception.getCause() 这样,就能抛出你所希望抛出的那个异常里。 try{ method.invoke(fun, args); } catch(

  • zgljl2012
1 min read
设计模式

【Python设计模式】概述

设计模式是面向对象设计领域经久不衰的话题。它虽然不是银弹,但要设计一个可维护、可扩展的系统,经过前人验证后的设计模式能给设计者提供巨大的帮助。 最初学习的设计模式是Java版的,现在转到了Python。Python是一门很简洁的语言,许多复杂的功能往往只需要安装一个第三方包,然后写一个函数便可实现自己想法,非常方便。但当我试图用Python写一个可扩展的系统时(能爬取全国各省企业的信用信息的系统),遇到了很大的麻烦。开始只是使用函数以及模块实现功能,本来还有种回到了刚写代码时写C语言头文件和函数的亲切感,但代码越写越多时——因为需要对每一个省的验证码进行分析破解以及对索引列表信息、详细信息的爬取——一种深深的无力感就袭来了。我知道,面向过程已经不管用了。于是开始用起了Python中的面向对象进行封装。 在开始使用面向对象的时候,自然而然地就想到了设计模式。于是在网上找了找资料,意外地Github上找到了一群外国大牛(项目贡献者们)开源的一个Python设计模式项目。所以,就有了这一系列文章。代码就不客气地Github这个开源项目的代码。开源项目的地址在此

  • zgljl2012
2 min read
设计模式

【Python设计模式】Factory Method 工厂方法模式

工厂方法模式是一种创建型模式,即一种用于创建对象的模式。举个例子,现在大部分的应用都想要变得international,国际化(特别是现在面临超强监管下的手游行业)。那国际化的第一步是什么呢?当然是语言的国际化,文化、历史这样的先搁一边,得先让人看懂,再来让人喜欢。所以我们第一步就必须让应用能做到能切换语言,要做到切换语言其实很容易,比如下面这段: if lan is 'Chinese': dog = "狗" cat = "猫" else lan is 'English': dog = "dog" cat = "cat" 这样做简单是简单,但不方便,

  • zgljl2012
3 min read
设计模式

动态代理

代理模式是设计模式中一个非常重要的模式,代理模式有两个角色,一个是代理类,一个是委托类,委托类也是真正的业务类,两者都有相同的接口; 代理类主要负责为委托类预处理消息、过滤消息、把消息转发 给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象并不真正实现服务,而是通过 调用委托类的对象的相关方法,来提供特定的服务。 Spring中的AOP基本原理就是动态代理。 代理模式可以根据代理类创建时期的不同分为两种: * 静态代理:程序员需要编写特定的源代码,在程序运行前,.class已存在 * 动态代理:在系统运行时,Java反射自动生成 静态代理就不记录了,值得好好学学的是动态代理。学习动态代理首先要学一下Java反射,它的实现常见的有两种: * JDK提供的InvocationHandler 接口和java.lang.

  • zgljl2012
8 min read
zgljl2012@gmail.com