靜態代理:
1、代理對象和目標對象都要實現的 公共接口
2、代理對象持有目標對象引用,重寫構造方法,
3、實現共同的方法,代理對象增強行爲。
缺點:
代理角色固定,一次只能代理一個對象。
接口
public interface Marry {
void marry();
}
目標對象
public class You implements Marry {
public void marry() {
System.out.println("sihai get marry");
}
}
代理對象
public class MarryCompany implements Marry {
private You you;
public MarryCompany(You you) {
this.you = you;
}
public void marry() {
before();
you.marry();
after();
}
private void after() {
System.out.println("get after work done");
}
private void before() {
System.out.println("get ready for marry");
}
}
測試
public class TestMarry {
public static void main(String[] args) {
You you = new You();
MarryCompany marryCompany = new MarryCompany(you);
marryCompany.marry();
}
}
結果
get ready for marry
sihai get marry
get after work done
動態代理
JDK動態代理:
/**
* JDK動態代理:
* 1. 目標對象要有接口,且最後創建的代理對象要轉換成此接口類型,來調用方
* 2. 動態代理類實現InvocationHandler接口,持有目標對象引用,利用構造器動態傳入目標對象
* 3. 使用proxy.newProxyInstance()來動態地創建代理對象
* 4. 代理對象重寫invoke方法,利用反射調用目標對象的方法,同時增加行爲
*/
public class JDKHandler implements InvocationHandler {
//目標對象引用
private Object target;
//構造器,可以動態傳入目標對象
public JDKHandler(Object target) {
this.target = target;
}
//創建代理對象
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//利用反射機制調用目標對象的方法,並增強行爲
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target,args);
after();
return result;
}
private void after() {
System.out.println("get after work done");
}
private void before() {
System.out.println("get ready for marry");
}
}
測試public class MarryTest {
public static void main(String[] args) {
//動態代理類,利用構造器傳入目標對象
JDKHandler jdkHandler = new JDKHandler(new You());
//創建代理對象 Marry marryProxy = (Marry) jdkHandler.getProxy(); //代理對象調用方法,會增加目標對象的行爲 marryProxy.marry(); }}
cgib動態代理
/**
* cglib動態代理
* 1. 目標對象
* 2. 實現MethodInterceptor接口,持有目標對象引用,利用構造器動態傳入目標對象
* 3. 重寫intercept方法,實現行爲增強
*/
public class CglibInterceptor implements MethodInterceptor {
//目標對象
private Object target;
//構造器
public CglibInterceptor(Object target){
this.target=target;
}
//動態創建代理對象
public Object getProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
//行爲增強
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
after();
Object result = methodProxy.invoke(target,objects);
return result;
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
}
目標對象
public class Hello {
public void print(){
System.out.println("hello");
}
}
測試public class Test {
public static void main(String[] args) {
//動態代理類
CglibInterceptor cglibInterceptor = new CglibInterceptor(new Hello());
//創建代理,且需要轉換成目標對象類型
Hello proxy = (Hello) cglibInterceptor.getProxy();
//代理對象調用方法,行爲會得到增強
proxy.print();
}
}