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 }

 

posted @ 2017-07-11 17:37  QiaoZhi  阅读(4785)  评论(3编辑  收藏  举报