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 }
