參考文章:
代理模式及Java實現(xiàn)動態(tài)代理
代碼:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyDemo {
public static void main(String[] args) {
//1.創(chuàng)建委托對象
AbsSubject real = new RealSub();
//2.創(chuàng)建調(diào)用處理器對象
ProxyHandler handler = new ProxyHandler(real);
//3.動態(tài)生成代理對象
AbsSubject proxySub = (AbsSubject)Proxy.newProxyInstance(real.getClass().getClassLoader(),
real.getClass().getInterfaces(), handler);
//4.通過代理對象調(diào)用方法
proxySub.doJob();
proxySub.sum(3, 9);
int m = proxySub.multiply(3, 7);
System.out.println("multiply result is:"+m);
}
}
//被代理類的接口
interface AbsSubject {
void doJob();
void sum(int a, int b);
int multiply(int a, int b);
}
//實際的被代理類
class RealSub implements AbsSubject {
@Override
public void doJob() {
// TODO Auto-generated method stub
System.out.println("i am doing something");
}
@Override
public void sum(int a, int b) {
System.out.println(a+" + "+b+" = "+(a+b));
}
@Override
public int multiply(int a, int b) {
// TODO Auto-generated method stub
System.out.println(a+" * "+ b);
return a*b;
}
}
//動態(tài)代理的內(nèi)部實現(xiàn),調(diào)用處理器類蟆技,即實現(xiàn) InvocationHandler 接口
//這個類的目的是指定運行時將生成的代理類需要完成的具體任務(包括Preprocess和Postprocess)
//即代理類調(diào)用任何方法都會經(jīng)過這個調(diào)用處理器類
class ProxyHandler implements InvocationHandler {
private Object realSub;
public ProxyHandler(Object object) {
realSub = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object res = method.invoke(realSub, args);
System.out.println("after");
return res;
}
}
運行截圖:
運行結(jié)果