本帖最后由 小石姐姐 于 2018-2-1 15:29 编辑
Ø 继承: 能够控制这个类
Ø 装饰者:增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用
Ø 动态代理:被增强的类实现了接口
Ø 代理的概述:
Ø JDK动态代理::Proxy对象
○ Proxy.new ProxyInstance(ClassLoader c1,Class[] interface,InvocationHandler )
Ø 参数一
○ 是被装饰对象的类的class对象.classloader,
○ 通常写成:对象.getClass.getClassLoader
Ø 参数二
§ 通常为InvocationHandler的 实现类对象.getClassinterfice,
• 通常写为实现类的对象.getClass().getInterfaces()
Ø 参数三
○ 是被装饰对象所实现的所有接口
○ InvocationHandler().InvocationHandlerd
动态代理的代码编写:
Proxy.newProxyInstance()
ClassLoader :类加载器
Class[] :被增强的对象进行所有实现的接口
InvocationHandler :处理类
@WebFilter(urlPatterns="/*")
public class GenericEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
// 增强req:
HttpServletRequest myReq = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),
req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 判断执行的方法是否是getParameter:
if("getParameter".equals(method.getName())){
// 调用的是getParameter:需要增强这个方法.
// 判断请求方式是GET还是POST:
String type = req.getMethod();
if("get".equalsIgnoreCase(type)){
String value = (String) method.invoke(req, args);
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
return value;
}else if("post".equalsIgnoreCase(type)){
req.setCharacterEncoding("UTF-8");
}
}
return method.invoke(req, args);
}
});
chain.doFilter(myReq, response);
}
@Override
public void destroy() {
}
}
Ø 总结:
○ 代理的企业应用:
§ Spring的AOP
• AOP的底层是使用动态代理完成
® AOP :面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!
Ø
|
|