Java動態代理相關
先來看靜態代理模式代碼:
package test;
public interface Subject
{
public void doSomething();
}
package test;
public class RealSubject implements Subject{
public void doSomething() {
System.out.println( "call doSomething()" );
}
}
package test;
public class SubjectProxy implements Subject {
Subject subimpl = new RealSubject();
public void doSomething() {
subimpl.doSomething();
}
}
package test;
public class TestProxy {
public static void main(String args[]) {
Subject sub = new SubjectProxy();
sub.doSomething();
}
}
先看代碼:
package test;
public interface Subject
{
public void doSomething();
}
package test;
public class RealSubject implements Subject {
public void doSomething() {
System.out.println( "call doSomething()" );
}
}
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHandler implements InvocationHandler {
private Object tar; //綁定委託對象,並返回代理類
public Object bind(Object tar) {
this.tar = tar; //綁定該類實現的所有接口,取得代理類
return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy , Method method , Object[] args)throws Throwable {
Object result = null;
//這裏就可以進行所謂的AOP編程了
//在調用具體函數方法前,執行功能處理
result = method.invoke(tar,args);
//在調用具體函數方法後,執行功能處理
return result;
}
}
public class TestProxy {
public static void main(String args[]) {
ProxyHandler proxy = new ProxyHandler(); //綁定該類實現的所有接口
Subject sub = (Subject) proxy.bind(new RealSubject());
sub.doSomething();
}
}
看完代碼,現在我來回答,動態代理的作用是什麼:- Proxy類的代碼量被固定下來,不會因爲業務的逐漸龐大而龐大;
- 可以實現AOP編程,實際上靜態代理也可以實現,總的來說,AOP可以算作是代理模式的一個典型應用;
- 解耦,通過參數就可以判斷真實類,不需要事先實例化,更加靈活多變。
轉載自知乎 :https://www.zhihu.com/question/20794107/answer/23330381