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

  • 相关阅读:
    综合练习:词频统计
    Dart SDK 2.0安装问题
    The DartEditor executable launcher was unable to locate its companion shared library.
    pycharm中如何正确配置pyqt5
    发现黑苹果带双显示器无法启动的原因
    Pycharm中用鼠标改变字体大小
    失望的visual studio for mac
    laravel 函数测试 --- Route::has()
    laragon 之Nginx
    laragon 之xdebug
  • 原文地址:https://www.cnblogs.com/empcl1314/p/7041453.html
Copyright © 2011-2022 走看看