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


    动态代理创建的核心代码:
    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);
    }

  • 相关阅读:
    WCF初探-21:WCF终结点(endpoint)
    WCF初探-20:WCF错误协定
    WCF初探-19:WCF消息协定
    WCF初探-18:WCF数据协定之KnownType
    WCF初探-17:WCF数据协定之等效性
    WCF初探-16:WCF数据协定之基础知识
    WCF初探-15:WCF操作协定
    WCF初探-14:WCF服务协定
    WCF初探-13:WCF客户端为双工服务创建回调对象
    WCF初探-12:WCF客户端异常处理
  • 原文地址:https://www.cnblogs.com/empcl1314/p/7041453.html
Copyright © 2020-2023  润新知