[java] JDK 的动态代理机制
首先说下,鉴于网上大量的垃圾代码,以及设计模式上面讲的很难看懂,本人写了个超级简单的(或许只是二逼的我认为的,呵呵)
首先说下个人的理解:代理的目的就是在你做事之前、之后、过程中。。。不改变你的行为(代码)加点其他东东
动态代理代码如下:
1 package proxy.myproxy.dynamicProxy; 2 3 public interface UserDao { 4 void save(); 5 }
1 package proxy.myproxy.dynamicProxy; 2 3 public class UserDaoImpl implements UserDao { 4 5 public void save() { 6 System.out.println("UserDao save()"); 7 } 8 9 }
1 package proxy.myproxy.dynamicProxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class InvocationHandlerImpl implements InvocationHandler { 7 8 private Object target; 9 10 public InvocationHandlerImpl(Object target){ 11 this.target = target; 12 } 13 14 public Object invoke(Object proxy, Method method, Object[] args)//args是那个你执行的那个方法的参数 15 throws Throwable {
System.out.println(proxy.getClass());//这里输出:class $Proxy0,可以看出proxy是什么
System.out.println(target.getClass());//这里输出:class proxy.myproxy.dynamicProxy.UserDaoImpl,可以看出target是什么 16 System.out.println("开始记录日志"); 17 Object obj = method.invoke(target, args);//obj是方法执行完之后的返回值 18 System.out.println("结束记录日志"); 19 return obj; 20 } 21 }
1 package proxy.myproxy.dynamicProxy; 2 3 import java.lang.reflect.Proxy; 4 5 public class Test { 6 public static void main(String[] args) { 7 UserDao userDao = new UserDaoImpl(); 8 9 UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), new InvocationHandlerImpl(userDao)); 10 11 userDaoProxy.save(); 12 13 } 14 }
静态代理代码如下:
1 package proxy.myproxy.staticProxy; 2 3 public interface UserDao { 4 void save(); 5 }
1 package proxy.myproxy.staticProxy; 2 3 public class UserDaoImpl implements UserDao { 4 5 public void save() { 6 System.out.println("UserDao save()"); 7 } 8 9 }
1 package proxy.myproxy.staticProxy; 2 3 public class UserDaoImplProxy implements UserDao { 4 5 private UserDao userDao = new UserDaoImpl();//合成 也可以传个引用过来 6 7 8 9 public void save() { 10 11 System.out.println("开始记录日志。。。"); 12 13 userDao.save(); 14 15 System.out.println("结束记录日志。。。。"); 16 17 } 18 19 }
1 package proxy.myproxy.staticProxy; 2 3 public class Test { 4 public static void main(String[] args) { 5 UserDao userDao = new UserDaoImplProxy(); 6 7 userDao.save(); 8 9 } 10 }
要是不知道代理的意思就去so、谷歌下,本人强烈建议谷歌
要是看不懂代码可以回复。