zoukankan      html  css  js  c++  java
  • 动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。

    动态代理创建的核心代码:
    TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance(
    Target.class.getClassLoader(),//与目标对象相同的类加载器
    new Class[]{TargetInterface.class},
    new InvocationHandler() {

    @Override
    //proxy 即该代理对象
    //method 代理对象的方法,里面封装这接口中的所有方法
    //args 目标对象的参数
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    Object invoke = method.invoke(new Target(), args); //调用的是目标对象相应的方法
    return invoke; //返回值是代理对象的,如果想要代理对象的返回值与目标对象的返回值一致的话,使用return invoke;
    }
    });
    动态代理的用处:解决全局乱码问题
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    /**
    * 使用动态代理完成乱码问题
    */
    HttpServletRequest proxyInstance = (HttpServletRequest) Proxy.newProxyInstance(
    req.getClass().getClassLoader(),
    req.getClass().getInterface(),
    new InvocationHandler() {

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    if("getParameter".equals(method.getName())){
    String invoke = (String) method.invoke(req, args);//乱码
    invoke = new String(invoke.getBytes("ISO-8859-1"), "UTF-8");
    System.out.println(invoke);
    return invoke;
    }
    return method.invoke(req, args);
    }
    });
    chain.doFilter(proxyInstance, resp);
    }

  • 相关阅读:
    Android的数据存储
    Servlet第一天
    JavaScript高级程序设计读书笔记(3)
    Interesting Papers on Face Recognition
    Researchers Study Ear Biometrics
    IIS 发生意外错误 0x8ffe2740
    Father of fractal geometry, Benoit Mandelbrot has passed away
    Computer vision scientist David Mumford wins National Medal of Science
    Pattern Recognition Review Papers
    盒模型bug的解决方法
  • 原文地址:https://www.cnblogs.com/empcl1314/p/7041453.html
Copyright © 2011-2022 走看看