学习动态代理之前,先来看一种常见的设计模式--代理模式。
代理模式是一中经常使用的设计模式。主要特点是代理类与委托类具有相同的接口。所谓委托类是接口的真正实现者,代理类只是调用委托类相关的方法实现特定的功能,代理类可以为委托类预处理信息。假设Personal为一个委托类。eat()方法是委托类的一个方法。在实现吃饭方法之前要盛饭。所以就出现一个代理类PersonalProxy,目的是预先处理一些操作。
以上是代理模式的主要思路。
所谓动态代理,就是利用反射的思想实现代理类。动态代理的实现主要利用了类Proxy与Invocationhandler接口来实现。
还是拿以上的人的例子来看。
首先,人(Personal)实现动物接口(Animal)
Animal接口:
public interface Animal {
void sleep();
void eat();
}
Persoal类
public class Personal implements Animal {
@Override
public void sleep() {
System.out.println("人在睡觉");
}
@Override
public void eat() {
System.out.println("人在吃饭");
}
public void play() {
System.out.println("人在玩耍");
}
}
人的动态代理类PersonalProxy
public class PersonalProxy implements InvocationHandler {
Object object;
public PersonalProxy(Object object) {
this.object = object;
}
public PersonalProxy() {
}
/**
* @param proxy
* @param method
* @param args
* @see java.lang.reflect.InvocationHandler#invoke(Object, Method, Object)
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("预先处理的事情");
Object invoke = method.invoke(object, args);
return invoke;
}
}
最后的实现demo
@Test
public void testProxy() {
InvocationHandler personalProxy = new PersonalProxy(new Personal());
Animal animal =(Animal) Proxy.newProxyInstance(Animal.class.getClassLoader(), new Class[]{Animal.class}, personalProxy);
animal.sleep();
}
在最后的demo中可以看出主要的方法
创建实现InvocationHandler接口对象。
然后创建动态代理类使用Proxy.newProxyInstance方法。创建出来的对象就是动态代理对象。
可以看出,实现InvocationHandler的对象必须实现invoke方法,这个方法就是所谓的代理类的预处理操作,调用实际业务类的操作。至于具体的原理,等待以后的详细描述