ICalc.java
public interface ICalc {
int add(int a, int b);
int sub(int a, int b);
}
ICalcImpl.java
public class ICalcImpl implements ICalc {
public int add(int a, int b) {
System.out.println("add......");
return a + b;
}
public int sub(int a, int b) {
System.out.println("sub.........");
return a - b;
}
}
Test.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author tu
*/
public class Test {
public static void main(String[] args) {
ICalc c = new ICalcImpl();
MyInterceptor i = new MyInterceptor();
ICalc proxy = (ICalc) MyProxy.getProxy(c,i);
int sub = proxy.sub(2, 1);
System.out.println("result:" + sub);
}
}
class MyInterceptor implements Interceptor {
public void preHandle() {
System.out.println("aaaa");
}
public void postHandle() {
System.out.println("bbbb");
}
}
//===========================================================================================
class MyHandler implements InvocationHandler {
private final Object target;
private final Interceptor interceptor;
MyHandler(Object target, Interceptor interceptor) {
this.target = target;
this.interceptor = interceptor;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
interceptor.preHandle();
Object res = method.invoke(target, args);
interceptor.postHandle();
return res;
}
}
class MyProxy {
public static Object getProxy(Object target, Interceptor interceptor) {
//第一个参数,类加载器
ClassLoader cl = MyProxy.class.getClassLoader();
//第二个参数,接口
Class<?>[] interfaces = target.getClass().getInterfaces();
//第三个参数,处理器
MyHandler myHandler = new MyHandler(target, interceptor);
return Proxy.newProxyInstance(cl, interfaces, myHandler);
}
}
interface Interceptor {
/**
* 前置通知
*/
void preHandle();
/**
* 后置通知
*/
void postHandle();
}