实现步骤
- 约定好接口(自定义名字),实现这个接口的类(自定义名字)设为Client
- 代理类 ,一定要实现InvocationHandler接口
- 调用Proxy.newProxyInstance(Client的类加载器,接口列表,绑定的代理类对象)生成proxy实例
- 可以通过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);
}
}
用途
在编译时不能确定接口中有什么方法可以调用的时候,就要使用动态代理
来源:CSDN
作者:weixin_37924741
链接:https://blog.csdn.net/weixin_37924741/article/details/103748225