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);
    }

  • 相关阅读:
    jar包启动的日志管理问题
    docker常用命令-----镜像与容器
    Maven+Nexus私服的搭建
    公允价值变动损益期末处理
    递延所得税资产怎么算
    固定资产转投资性房地产的差额为什么计入其他综合收益
    固定资产转投资性房地产
    固定资产折旧方法
    SublimeText注册码(亲测可用)
    未分配利润和净利润的区别是什么?
  • 原文地址:https://www.cnblogs.com/empcl1314/p/7041453.html
Copyright © 2011-2022 走看看