有一个类A,我们不想直接调用A的方法,而想要通过类B来间接调用A的方法。这时候A就叫做被代理类或者委托类(委托了任务的类),而B叫做代理类。
看下面的代码
public class A
{
public void method1()
{
System.out.println("A类的method1执行");
}
}
public class B
{
A a = new A();
public void method1()
{
a.method1();
}
}
这就是B代理了A,但是这是我们事先就编好的程序,所以叫做静态代理。有没有办法可以在程序运行的时候自动生成类似B的代理类呢,当然可以。java提供了自动生成代理类的类库,我们只需要会用,就可以自动生成代理类了,也就是动态代理,下面是使用动态代理的过程。
一、编写一个被代理类需要实现的接口
public interface AInterface
{
public void method1();
}
二、被代理类实现这个接口
public class A implements AInterface
{
public void method1()
{
System.out.println("A类的method1执行");
}
}
三、实现 InvocationHandler 接口,他是连接被代理类和代理类的
public class InvocationHandlerImpl implements InvocationHandler
{
private Object target;
public InvocationHandlerImpl() {}
//传入需要代理的对象实例
public InvocationHandlerImpl(Object target) {
this.target = target;
}
/**
* proxy是代理类对象实例
* method是代理类调用的被代理类接口中的方法
* args是执行method传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("开始代理前的操作。。。");
Object obj = method.invoke(target);
System.out.println("开始代理后的操作。。。");
return obj;
}
}
四、动态生成代理类
public class Main
{
public static void main(String[] args)
{
InvocationHandlerImpl invocationHandler = new InvocationHandlerImpl(new A());
//第一个参数是AInterface的类加载器
//第二个参数是AInterface.class组成的Class数组
//第三个是invocationHandler实例
//这里动态生成A的代理类b
AInterface b = (AInterface) Proxy.newProxyInstance(
AInterface.class.getClassLoader(),
new Class[]{AInterface.class},
invocationHandler);
//b调用method1最终会调用A的method1
b.method1();
}
}
为了理解方便,我画了一个关系图