动态代理是设计模式中的一种。其目的是通过为其他对象提供一个代理,达到控制对某个对象的访问。代理类为委托类做消息预处理、过滤、转发,以及做一些后续处理。
实现JDK(接口型)动态代理(必须实现接口才能代理):
1.定义一个接口
public interface Dog
{
public void run(String dogType, float speed);
public void eat(String dogType, String food);
}
2.实现接口
public class DogImpl implements Dog
{
@Override
public void run(String dogType, float speed) {
System.out.println(dogType + " can run very fast! Can reach " + speed + " m/s");
}
@Override
public void eat(String dogType, String food) {
System.out.println(dogType + " likes to eat " + food);
}
}
3.定义一个invocationHandler类,实现InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DogInvokationHandler implements InvocationHandler
{
private Object object;
public Object newProxy(Object object, Class[] interfaces)
{
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object
.getClass().getInterfaces(), this);
}
/**
* @param proxy --代理对象
* @param method -- 方法,被调用方法.
* @param args -- 方法的参数
*/
@Override
public Object invoke(Object obj, Method method, Object[] var3) throws Throwable {
// before
System.out.println("在调用Dog接口的方法前,先做点儿别的。");
// 调用被代理类方法
method.invoke(object, var3);
// after
System.out.println("在调用Dog接口的方法后,处理下后续。");
return null;
}
}
4.调用
public class ProxyTest {
public static void main(String[] args) {
Dog dog = new DogImpl();
DogInvokationHandler dogInvokationHandler = new DogInvokationHandler();
dog = (Dog) dogInvokationHandler.newProxy(dog,new Class[] {Dog.class});
dog.run("Gree dog", 70);
}
}
运行输出结果:
代理涉及的类:
1.java.lang.reflect.Proxy,java动态代理机制类:提供一组静态方法为一组接口动态地生成代理类及其对象。
2.java.lang.reflect.InvocationHandler,调用处理器接口:定义了一个invoke方法,用于集中处理动态代理类对象上的方法调用。通常在该方法中实现对委托类的代理访问。
3.java.lang.ClassLoader,类加载器:负责将类的字节码装载到JVM中,并未其定义类对象。该类才能被使用
实际上动态代理的基本角色有三种:
1.Subject——负责定义RealSubject和Proxy角色应该实现的接口
2.RealSubject——真正完成业务服务功能
3.Proxy——将请求调用RealSubject对应的request功能来实现业务。