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


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

  • 相关阅读:
    Java.Util.List(List接口)
    在VMware安装Centos7
    java中原生的发送http请求(无任何的jar包导入)
    二叉树算法的收集
    javascript将list转换成树状结构
    CSS实现鼠标悬浮无限向下级展示的简单代码
    Jquery的框架解析
    mybaits插入时的一些总结
    苹果手机在有滚动条的情况下,滑动不顺畅的原因
    tomcat下jndi的三种配置方式
  • 原文地址:https://www.cnblogs.com/empcl1314/p/7041453.html
Copyright © 2020-2023  润新知