动态代理

来源:互联网 发布:智能数据盒子 编辑:程序博客网 时间:2024/06/05 07:00

基于接口的动态代理:Proxy
如果一个类没有实现任何的接口,此种代理就不能使用了。

Proxy 类的静态方法:
newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
* ClassLoader :类的加载器.
* Class[] :类实现的所有的接口的Class的对象.
* InvocationHandler :真正的处理对象.(拦截器)

@Override    /**     * proxy:代理对象.     * method:指代的方法本身(正在执行的方法)     * args :方法的参数列表     * 方法可能有返回值     */    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        return null;    }
package com.ail.all;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;import javax.servlet.http.HttpServletResponse;@WebFilter(urlPatterns="/*")public class Myfilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        // TODO Auto-generated method stub    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {            //在这里解决乱码的问题            final HttpServletRequest req = (HttpServletRequest) request;            //req.getParameter(name)            HttpServletRequest myProxy = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),                     req.getClass().getInterfaces(), new InvocationHandler() {                @Override                public Object invoke(Object proxy, Method method, Object[] args)                        throws Throwable {                    //增强的是getparmter                    if("getParameter".equals(method.getName())) {                        String m = req.getMethod();                        if("get".equalsIgnoreCase(m)) {                        String value = (String) method.invoke(req, args);                            value=new String(value.getBytes("iso-8859-1"),"utf-8");                            return value;                        }else if("post".equalsIgnoreCase(m)){                            req.setCharacterEncoding("utf-8");                        }                    }                    return method.invoke(req, args);                }            });        chain.doFilter(myProxy, response);    }    @Override    public void destroy() {        // TODO Auto-generated method stub    }}
0 0
原创粉丝点击