java动态代理

╮(╯▽╰)╭ 好久没写了,越来越退步了,不能这样呀,要么彻底放弃,要么一鼓作气。我要选择后者!!

今天重新学习了下java动态代理~

1、静态代理。图形描述:

代码:

//接口
public interface User{
     public void addUser(String username,String password);   
}
View Code
//接口实现类,被代理类
public class UserManage implements User{
    
      public void addUser(String username,String password)    
     {
            System.out.println("save....");
            //do something   
     }
}
View Code
//代理类
public class UserProxy{
     private User user;
     public UserProxy(User user)
     {
           this.user = user;
     }   

     public void saveUser()
    {
          //代理的方法实现。。
          this.user.save();
     }   
}
View Code

以上就是静态代理,说白了代理类就是用构造函数将被代理对象传入以取得控制权,在代理类完成一些代理的功能后,然后实现被代理类原有的功能。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);
}

╮(╯▽╰)╭ 再接再厉吧。

posted @ 2013-10-08 23:35  爱生活者wmmang  Views(175)  Comments(0Edit  收藏  举报