java.lang.reflect API 提供了一个叫Proxy的类和一个叫InvocationHandler,下面我们使用这两个API来实现Java的动态代理。
Proxy Class in Java
java.lang.reflect.Proxy 类中有个静态方法 newProxyInstance,是用来创建动态代理类,这个方法的定义如下:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
先简单理解一下上面这个方法的参数
- ClassLoader:这个class loader在动态代理类中被使用,它可以从类或者接口中或得,比如 Task.class.getClassLoader()
但是,如果我们已经拿到的实例,我们也可以从实例中获得:ob.getClass().getClassLoader() - 第二个参数需要一个被代理类实现的所有接口的数组
- 实现接口 java.lang.reflect.InvocationHandler 的类的实例
InvocationHandler in Java
第一步: 要实现动态代理,咱得有个目标接口和接口的实现类,就是我们要对那个接口进行代理。
public interface Task {
void doSomething(String things);
String makeSomething(String seed);
}
public class TaskImpl implements Task {
@Override
public void