zoukankan      html  css  js  c++  java
  • JDK动态代理原理

    1.首先需要记住

    JDK的Proxy方式实现的动态代理 目标对象必须有接口 没有接口不能实现jdk版动态代理

    2.一张图说明动态代理原理

    3.公共接口

    4.目标对象

     5.代理对象

     1 package Proxy;
     2 
     3 
     4 import java.lang.reflect.InvocationHandler;
     5 import java.lang.reflect.Method;
     6 import java.lang.reflect.Proxy;
     7 
     8 public class ProxyTest2 {
     9 
    10     public static void main(String[] args) {
    11         
    12         final Target target = new Target();
    13         
    14         //动态创建代理对象
    15         
    16         TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
    17                 target.getClass().getClassLoader(), 
    18                 target.getClass().getInterfaces(), 
    19                 new InvocationHandler() {
    20                     @Override
    21                     //被执行几次?------- 看代理对象调用方法几次
    22                     //代理对象调用接口相应方法 都是调用invoke
    23                     /*
    24                      * proxy:是代理对象
    25                      * method:代表的是目标方法的字节码对象
    26                      * args:代表是调用目标方法时参数
    27                      */
    28                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    29                         //反射知识点
    30                         Object invoke = method.invoke(target, args);//目标对象的相应方法
    31                         //retrun返回的值给代理对象
    32                         return invoke;
    33                     }
    34                 }
    35             );
    36         
    37         proxy.method1();//调用invoke---Method:目标对象的method1方法  args:null  返回值null
    38         String method2 = proxy.method2();//调用invoke---Method:目标对象的method2方法  args:null  返回值method2
    39         int method3 = proxy.method3(100);////调用invoke-----Method:目标对象的method3方法 args:Object[]{100}  返回值100
    40         
    41         System.out.println(method2);
    42         System.out.println(method3);
    43         
    44     }
    45     
    46 }

     参数解释:

    最后给出一个基于动态代理的增强方法的过滤器

     1 package filter;
     2 
     3 
     4 import java.io.IOException;
     5 import java.io.UnsupportedEncodingException;
     6 import java.lang.reflect.InvocationHandler;
     7 import java.lang.reflect.Method;
     8 import java.lang.reflect.Proxy;
     9 
    10 import javax.servlet.Filter;
    11 import javax.servlet.FilterChain;
    12 import javax.servlet.FilterConfig;
    13 import javax.servlet.ServletException;
    14 import javax.servlet.ServletRequest;
    15 import javax.servlet.ServletResponse;
    16 import javax.servlet.http.HttpServletRequest;
    17 import javax.servlet.http.HttpServletRequestWrapper;
    18 
    19 import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage_1_0;
    20 
    21 public class EncodingFilter2 implements Filter{
    22 
    23     @Override
    24     public void init(FilterConfig filterConfig) throws ServletException {
    25         // TODO Auto-generated method stub
    26         
    27     }
    28 
    29     @Override
    30     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    31             throws IOException, ServletException {
    32     HttpServletRequest req = (HttpServletRequest) request;    
    33     
    34     HttpServletRequest enhanceRequset = (HttpServletRequest) Proxy.newProxyInstance(
    35             req.getClass().getClassLoader(), 
    36             req.getClass().getInterfaces(),
    37             new InvocationHandler() {
    38                 
    39                 @Override
    40                 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    41 //                    对getParameter进行增强
    42                     if(method.getName().equals("getParameter")){
    43                         String invoke = (String) method.invoke(req, args);//乱码
    44                         invoke = new String(invoke.getBytes("iso8859-1"),"UTF-8");//转码
    45                         return invoke;
    46                     }
    47                     return method.invoke(req, args);
    48                 }
    49             });
    50         chain.doFilter(enhanceRequset, response);//放行
    51     }
    52 
    53     @Override
    54     public void destroy() {
    55         // TODO Auto-generated method stub
    56         
    57     }
    58 
    59     
    60 }
  • 相关阅读:
    【sklearn文本特征提取】词袋模型/稀疏表示/停用词/TF-IDF模型
    【新人赛】阿里云恶意程序检测 -- 实践记录10.13
    【sklearn朴素贝叶斯算法】高斯分布/多项式/伯努利贝叶斯算法以及代码实例
    【sklearn决策树算法】DecisionTreeClassifier(API)的使用以及决策树代码实例
    【笔记】机器学习
    【笔记】机器学习
    【笔记】机器学习
    【笔记】机器学习
    【笔记】机器学习
    java架构师学习路线-漫谈分布式服务框架
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7151748.html
Copyright © 2011-2022 走看看