动态代理模式

动态代理模式

Posted by candy1126xx on June 18, 2017

定义

在运行时动态地为实现类创建代理对象,以控制对执行者的访问。

主要构成:

  • 功能接口:定义暴露方法。
  • 实现类:实现了功能接口,真正处理逻辑的类。
  • 扩展类:实现InvocationHandler接口,在实现类成员方法调用前后添加处理逻辑的类。
  • 代理类:运行时调用Proxy.newProxyInstance()生成的代理类。

实现

// 功能接口
public interface Service {
	void do();
}

// 实现类
public class ServiceImpl {
	public void do() {...}
}

// 扩展类
public class ServiceExtender implements InvocationHandler {
	public Object invoke(Object proxy, Method method, @Nullable Object[] args) {
		// 可以通过反射,获取方法的注解、参数的注解、类型参数
		Annotation[] methodAnnotations = method.getAnnotations();
		Annotation[][] parameterTypes = method.getParameterAnnotations();
		Type[] parameterAnnotationsArray = method.getGenericParameterTypes();
		// do something...
		return method.invoke(this, args);
	}
}

// 获取代理对象
Service service = Proxy.newProxyInstance(
		getClassLoader(),            // ClassLoder
		new Class<?>[] { service },  // 要代理的类的接口的Class对象的数组
		new ServiceExtender());      // 扩展类对象