【案例:使用动态代理完成字符集编码过滤器的编写】
【request中的方法的增强】
* 继承 :能够控制这个类的构造.
* 装饰者 :增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用.
缺点:* 接口中方法过多,只增强其中的某个方法.其他的方法也需要重写.
* 动态代理 :被增强的类实现了接口.
【代理的概述】
Note;可以理解为,用一个代理对象代替需要被增强的类
* JDK中动态代理:Proxy对象.
* Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih); // Invocation 调用
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
Class clazz = req.getClass();
ClassLoader classLoader = clazz.getClassLoader();
Class[] interfaces = clazz.getInterfaces();
HttpServletRequest myRequest = (HttpServletRequest)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
// 匿名内部类,重写invoke方法
// method就是增强对象调用的方法,args就是方法的参数,proxy是代理对象的引用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 如果调用的是getParameter方法,则进行增强
if("getParameter".equals(method.getName())){
// 如果是Post方法
if("POST".equals(req.getMethod())){
req.setCharacterEncoding("utf-8");
return method.invoke(req, args);
// 如果是Get方法
}else if("GET".equals(req.getMethod())){
return new String(req.getParameter((String)args[0]).getBytes("iso-8859-1"),"UTF-8");
}
}
// 其他不增强的方法,直接调用不增强
return method.invoke(req, args);
}
});
// 最后放行
chain.doFilter(myRequest, response);
}
代理的企业应用:
【Spring的AOP】
AOP的底层使用的就是代理机制:
* AOP :面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!
类加载器:
类的加载器:将class文件加载到JVM中执行这个文件.
Java中将类加载器分成三类:
引导类加载器: JAVA_HOME/jre/lib/rt.jar
|
扩展类加载器: JAVA_HOME/jre/lib/ext/*.jar
|
应用类加载器: 加载类路径下的所有的class.
这些类加载器如何保证类只会加载一次而且不会重复加载:
类加载器的全盘委托机制:
class A {
String s;
}
由应用类加载器得到A.class String,class,委托给扩展类加载器,扩展类加载器又委托给引导类加载器.引导类加载器加载String.class.将其他的类的class向下给扩展类加载器.扩展类加载器没有找到.向下给应用类加载器,将A.class 加载. |
|