方式1:装饰者模式解决中文乱码
自定义类继承HttpServletRequestWrapper,只重写getParameter(String str)方法,然后再过滤器中使用 自定义类包装request对象即可。
方式2:动态代理解决中文乱码
如果只对某个方法进行增强,使用动态代理非常灵活。
动态代理对象介绍:
Proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
核心方法: Object static newProxyInstance(ClassLoader loader,Class[] interfaces, InvocationHandler h) 这三个参数都是固定写法
参数一:通过被增强对象获取类加载器(应用类加载器)
参数二:通过被增强对象获取所有实现类的接口
参数三:动态代理的处理类,用于对方法的增强,此时使用匿名内部类
动态代理操作步骤:
1、创建被增强对象
2、创建增强后的对象
2.1、通过被代理对象获取类加载器---xxx.getClass().getClassLoader()
2.2、通过被代理对象获取其所有接口---xxx.getClass().getinterfaces()
2.3、创建一个处理类(专门用来增强方法)
实现动态代理,根本不知道它的实现类
图666666
类加载器:类加载器是负责加载类的对象。将class文件(硬盘)加载到内存生成class对象。
所有的类加载器都是java.lang.ClassLoader的子类
引导类加载器:BootStrapClassLoader C、C++
它加载的是Java\jdk1.7.0_72\jre\lib\rt.jar
扩展类加载器:ExtClassLoader
它加载的是Java\jdk1.7.0_72\jre\lib\ext\*.jar extension
应用类加载器:AppClassLoader
它加载的是程序员编写的类
使用:类.class.getClassLoader() 获取自己的类加载器
类加载器加载机制:全盘负责委托机制
全盘负责:A类如果要使用B类(不存在),A类加载器C必须负责加载B类
委托机制:A类加载器如果要加载资源B,必须询问父类加载器是否加载
如果加载,将直接使用;如果没有机制,自己再加载。
采用全盘负责委托机制保证一个class文件只会被加载一次,生成一个Class对象。
全盘委托机制:
1、应用类加载器:加载所有的class文件,但是不将其生成对应Class对象,而是委托给扩展类加载器;
2、扩展类加载器:加载所有的class文件,但是不将其生成对应Class对象,而是委托给引导类加载器;
3、引导类加载器:加载所有的class文件,只将自己负责的class文件(rt.jar)生成对应的Class对象,将其他 的class文件转交给扩展类加载;
4、扩展类加载器:只将自己负责的class文件(ext目录下的jar)生成对应的Class对象,将其他的class文件转 交给应用类加载;
5、应用类加载器:负责将剩余的class文件生成对应的Class对象。
待续……