动态署理
署理模式是 Java 中的常用设计模式,署理类通过挪用被署理类的相关要领,提供预处理惩罚、过滤、过后处理惩罚等处事,动态署理及通过反射机制动态实现署理机制。JDK 中的 java.lang.reflect.Proxy 类可以用来实现动态署理。
首先,筹备一个简朴的接口和实现类
/**
* 接口 IHello.java
*/
public interface IHello {
void hello();
}
/**
* 实现类 Hello.java
*/
public class Hello implements IHello {
@Override
public void hello() {
System.out.println("我是Hello.");
}
}
通过 Proxy 实现动态署理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class HelloTest {
@Test
public void testProxy() throws Exception {
final IHello hello = new Hello();
/*
* proxyHello : 署理主题脚色,署理类的实例
* IHello : 抽象主题脚色,署理类和被署理类都需要实现的接口,JDK中的动态署理必需针对接口
* hello : 真实主题脚色,被署理类的实例
*/
IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[] { IHello.class }, new InvocationHandler() {
/*
* proxy : 当前署理类的一个实例; 若挪用proxy的非final要领,将造成无限轮回挪用
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 前期的业务逻辑操纵
System.out.println("---开始");
// 挪用被署理类的要领,传入参数args,获得返回
Object object = method.invoke(hello, args);
// 后期的业务逻辑操纵
System.out.println("---竣事");
return object;
}
});
proxyHello.hello();
}
}

