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 }
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】