【关于java中的“增强”类的几种方法】为了便于对现有项目的扩展,我们会通过java的特性,对现有的类进行“强化”,在此介绍几种方法
- 继承,java是面向对象的语言,继承机制使他的可扩展性大大增强,我们可以通过继承方式对现有类进行扩展增强。子类继承父类之后可以获得父类所有的公共方法,子类可以进行重写等操作,这种方式简便易学,但是随之而来的是代码的耦合性大大的增强,不利于后期的维护,所以对于继承这种方法,谨慎使用。
- 实现接口类,随着继承机制而来的是实现接口技术,子类实现接口类,对接口进行重写操作,通过多态的形式进行调用,这种方法大大减少了代码耦合性,可以说是改良版的继承模式,在目前的编程中,我们一般是尽可能的使用接口,而尽可能少的使用继承
- 装饰者设计模式,设计模式是java编程的重要组成部分,确切的说不仅仅是Java,几乎所有的高级编程语言都多多少少会涉及到编程模式。当然想要完全理解设计模式,单纯学习一门语言是完全不够的,java只是设计模式的其中一个代表。百度百科中的解释为:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。这种说法很抽象,我们可以举一个比较简单的例子,即java的IO流就是标准的装饰者模式,字节流往往会作为被装饰的类即,作为装饰类的输入字符流等类中,装饰的类需要实现被装饰类的接口,在这里我们拿出java中的两个类做解释InputStream和BufferedInputStream,两个类分别为字节输入流和字节缓冲输入流,简单来说缓冲流就是字节流的强化版,使用的模式就是装饰者模式,我们可以看到BufferedInputStream的构造方法中BufferedInputStream(InputStream in) 字节流就是作为参数输入,这样缓冲流中的可以通过输入的字节流对象来调用字节流中的所有的方法,同时不会妨碍缓冲流的私有方法,这就是比较经典的装饰者强化
- 代理模式,代理类模式理解起来会比装饰者设计模式更加难,因为这个涉及到反射的原理,此处可以看一段代码
HttpServletRequest MyRequest = (HttpServletRequest)Proxy.newProxyInstance(
Codefilter.class.getClassLoader(),
request.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String method1 = method.getName();
if("getParameter".equals(method1)){
String requestMethod = request.getMethod();
if("get".equalsIgnoreCase(requestMethod)){
String str = request.getParameter(args[0].toString());
return new String(str.getBytes("iso-8859-1"),"utf-8");
}
}
return method.invoke(request, args);
}
});
通过Codefilter类的类对象获得类加载器,当然此时的类加载器为appclassloader,主要是负责加载应用类,再通过newProxyInstance方法的第二个参数,获得类的接口,然后第三个参数传入一个InvocationHandler接口的匿名实现类,此时就可以重写invoke方法来对类进行加强,以上的代码的例子就行增强的request对象中的getParameter方法,使之可以处理汉字在tomcat中的乱码问题。相对于装饰者设计模式,代理模式不用考虑因为实现被装饰的类的接口而重写的大量的方法,代理模式代码量比较少,完成功能比较多,这也是spring框架中的aop面向切面编程的底层实现方法。
推荐阅读
- Eclipse中Spring的引入
- 在idea中 使tomcat中配置的虚拟路径生效
- javaSE|javaEE JDBC, dbutils插件, 事务
- Windows平台Redis的安装和配置
- javax.inject.jar(依赖注入非常方便的jar包)
- 在Win下搭建JSP开发环境
- windows下RocketMQ安装部署
- jstl判段对象是否为空
- RequestHolder
- BeanValidator