一、方法增强三种方式
** 第一种 继承:要知道父类
** 第二种 装饰者模式:
*** 两个类实现相同的接口,得到另一类的引用
*** 缺点:需要把接口里面的所有的方法都实现
** 第三种 动态代理
*** 比如移动总部,和各地的代理商例子
*** 通过类 Proxy里面方法是
*** newProxyInstance(TestProxy02.class.getClassLoader(), interfaces, new MyInvocationHand())可以创建接口的代理的实现类。
//三个参数:
/*
* 第一个参数:类加载器
* 第二个参数:生成实现类的接口
* 第三个参数:增强接口里面的方法,
* 实现逻辑写在里面 使用接口里面的方法 invoke(Object proxy, Method method, Object[] args)
* */
二、Demo.java
package com.ayit.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 子类继承父类实现方法的增强
*
* 接口实现类实现方法的增强,用增强类构造传递实现类的引用——装饰者模式
*
* 接口动态代理,获取同级实现类,使用类Proxy实现Perso接口的方法的增强,invoke指定方法增强通过参数mothod类实现——动态代理
* @author XiaYuJia
*
*/
public class DynamicProxy {
public static void main(String[] args) {
Class[] interfaces = {Person.class};
Person per = (Person) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),interfaces, new MyInvocationHandler());
per.eat();
}
}
class MyInvocationHandler implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("200-----------------");
return null;
}
}
interface Person{
public void eat();
}
class Lucy implements Person{
@Override
public void eat() {
System.out.println("1000----------------");
}
}
三、HttpServletRequest通用编码处理getParameter方法增强
package com.ayit.dynamicproxy;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* request里面方法有很多 -首先进行方法判断,是否为getParameter -判断提交方式。进行相应处理
*
* @author XiaYuJia
*
*/
@WebFilter(urlPatterns = "/*")
public class MyHttpServletRequest implements Filter {
@SuppressWarnings("all")
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
//强制类型转换,匿名内部类使用需要final修饰
final HttpServletRequest request = (HttpServletRequest) req;
//动态代理实现接口方法增强
Class[] interfaces = { HttpServletRequest.class };
//proxy三个参数:类加载器,接口类,调用处理内部类
HttpServletRequest myreq = (HttpServletRequest) Proxy.newProxyInstance(
MyHttpServletRequest.class.getClassLoader(), interfaces,
new InvocationHandler() {
//方法实现
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// 判断方法名为getParameter
if ("getParameter".equalsIgnoreCase(method.getName())) {
// 获取提交的方式Post,Get
String mtd = request.getMethod();
if ("GET".equalsIgnoreCase(mtd)) {
String s = (String) method
.invoke(request, args);
s = new String(s.getBytes("ISO-8859-1"),
"UTF-8");
return s;
} else if ("POST".equalsIgnoreCase(mtd)) {
request.setCharacterEncoding("UTF-8");
}
}
return method.invoke(request, args);
}
});
chain.doFilter(myreq, resp);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
}