java动态代理
╮(╯▽╰)╭ 好久没写了,越来越退步了,不能这样呀,要么彻底放弃,要么一鼓作气。我要选择后者!!
今天重新学习了下java动态代理~
1、静态代理。图形描述:
代码:
//接口 public interface User{ public void addUser(String username,String password); }
//接口实现类,被代理类 public class UserManage implements User{ public void addUser(String username,String password) { System.out.println("save...."); //do something } }
//代理类 public class UserProxy{ private User user; public UserProxy(User user) { this.user = user; } public void saveUser() { //代理的方法实现。。 this.user.save(); } }
以上就是静态代理,说白了代理类就是用构造函数将被代理对象传入以取得控制权,在代理类完成一些代理的功能后,然后实现被代理类原有的功能。so easy~
2、动态代理,与静态代理一样,都是通过构造函数将被代理对象传入以取得控制权,不过采用多态的思想,将原本具体的对象变成Object。
来看看代理类:
//动态代理 public class InvocationHandleImpl implements InvocationHandler { private Object obj; public InvocationHandleImpl(Object obj){ this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //1、代理的一些功能... //2、调用被代理的方法 return method.invoke(this.obj, args); } }
使用动态代理:
public static void main(String[] args) { User user = new UserManage(); //传入被代理对象UserManage InvocationHandleImpl h = new InvocationHandleImpl(user); //根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy.$Proxy类实现了interfaces的接口,并继承了Proxy类. //接着将代理类h通过构造函数传入,返回的是Proxy对象,被强制转换成User User userProxy = (User)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), h); //会调用Proxy类的save方法,而Proxy类的save方法调用super.h.invoke(this,method,args); userProxy.save(xx,xxx); }
╮(╯▽╰)╭ 再接再厉吧。