动态代理

静态代理

先创建一个接口类

public interface IUser {
     void show();
}

然后创建一个接口实现类,Impl是接口实现类的意思

public class UserImpl implements IUser{

  public UserImpl(){}
  @Override
  public void show() {
       System.out.println("展示");

   }
}

然后写个代理类

public class UserProxy implements  IUser{
   IUser user;
    public UserProxy(){}
    public UserProxy(IUser user){
       this.user = user;
    }
    public void show(){
        user.show();
        System.out.println("调用了show");
   }
}

测试一下

public class ProxyTest {
public static void main(String[] args){
    IUser user = new UserImpl();
    IUser UserProxy = new UserProxy(user);
    UserProxy.show();

}

}

输出

  展示
  调用了show

动态代理

但是因为一个函数一个函数调用很麻烦,所以我们用动态代理

他要在运行的函数写一句proxy.newProxyInstance(类加载器,代理的接口,InvocationHandler(调用处理器)(要做的事情写到里面会执行))

我们先自己写一个InvocationHandler

public class UserInvocationHandler implements InvocationHandler {
IUser user;

public UserInvocationHandler(){

}
public UserInvocationHandler(IUser user){
    this.user = user;

}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Exception {
    method.invoke(user, args);
    return null;
}
}

ok,我们回到主函数,给他们赋值

public class ProxyTest {
   public static void main(String[] args){
      IUser user = new UserImpl();

       InvocationHandler userinvocationhandler = new UserInvocationHandler(user);
       IUser iuser = (IUser) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(),userinvocationhandler);
       iuser.show();

   }
}

OK,成功输出

  展示
posted @ 2024-08-08 00:42  毛利_小五郎  阅读(12)  评论(0)    收藏  举报