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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM