JDK实现动态代理

帅比萌擦擦* 提交于 2020-02-01 07:51:47

实现步骤

  1. 约定好接口(自定义名字),实现这个接口的类(自定义名字)设为Client
  2. 代理类 ,一定要实现InvocationHandler接口
  3. 调用Proxy.newProxyInstance(Client的类加载器,接口列表,绑定的代理类对象)生成proxy实例
  4. 可以通过proxy.method()调用接口中约定好的方法

实例如下:

public interface ClientInterface{//约定的要被代理的接口
    public  int add(Integer a,Integer b);
    public  int subtract(Integer amount,Integer part);
}

public class Person implements  ClientInterface{//实现了约定的接口的类

    @Override
    public int add(Integer a, Integer b) {
        return (a+b);
    }

    @Override
    public int subtract(Integer amount, Integer part) {
        return (amount-part);
    }
}
public class Agency implements InvocationHandler {//代理类
    Object client;//要被代理的对象
    public Agency(Object obj){//构造器
        this.client = obj;
    }
    public Object genProxy(){//生成代理对象
        return Proxy.newProxyInstance(client.getClass().getClassLoader(),client.getClass().getInterfaces(),this);
        //上面函数的入参this,表示代理对象的操作都会转发到这个对象,然后调用这个对象的invoke方法实现调用
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//运用代理对象调用对应方法,支持传参
        System.out.println("you can do sometthing before "+method.getName()+" invoked");
        Object result = method.invoke(client,args);//注意这里的入参是客户端
        System.out.println("you can do something after "+method.getName()+" invoked");
        return result;
    }
}
public class AgencyTest {
    public static void main(String[] args) {
        Person person = new Person();
        Agency agent = new Agency(person);
        ClientInterface proxy = (ClientInterface)agent.genProxy();
        int a = proxy.add(new Integer(1),new Integer(2));
        int b = proxy.subtract(new Integer(5),new Integer(3));
        System.out.println(a);
        System.out.println(b);
    }
}

用途

在编译时不能确定接口中有什么方法可以调用的时候,就要使用动态代理

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!