欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

java靜態代理和動態代理的區別

何燕霞1年前7瀏覽0評論

Java中代理是很常見的一種編程模型,它的主要目的是為了幫助我們解耦代碼,降低代碼的復雜度。Java中常見的代理有靜態代理和動態代理。那么,它們之間有什么區別呢?

靜態代理

靜態代理使用構造函數或設置方法直接創建類的實例,它們提供了和原來接口相似的方法,同時在方法調用前后可以進行一些操作。

public interface Subject {
public void doSomething();
}
public class RealSubject implements Subject{
@Override
public void doSomething() {
System.out.println("RealSubject doSomething...");
}
}
public class ProxySubject implements Subject{
private Subject subject;
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void doSomething() {
System.out.println("before doSomething ...");
subject.doSomething();
System.out.println("after doSomething ...");
}
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject(new RealSubject());
proxySubject.doSomething();
}
}

在上面的例子中,RealSubject就是被代理類,ProxySubject就是代理類,實現Subject接口(或者說是繼承Subject類),并在構造方法中傳入RealSubject實例。同時,也實現了Subject接口的doSomething方法,在代理模式下,我們修改了RealSubject在doSomething方法前后的動作。

動態代理

動態代理是在程序運行時,通過反射機制動態生成一個代理類來代替原始類,因此可以實現多個接口的方法代理。

public interface Subject {
public void doSomething();
}
public class RealSubject implements Subject{
@Override
public void doSomething() {
System.out.println("RealSubject doSomething...");
}
}
public class DynamicProxyHandler implements InvocationHandler {
private Object realObject;
public DynamicProxyHandler(Object realObject) {
this.realObject = realObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before doSomething ...");
method.invoke(realObject, args);
System.out.println("after doSomething ...");
return null;
}
public static void main(String[] args) {
Subject realSubject = new RealSubject();
InvocationHandler handler = new DynamicProxyHandler(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);
proxySubject.doSomething();
}
}

在上面的例子中,我們使用實現InvocationHandler接口的代理句柄DynamicProxyHandler來實現動態代理。我們需要傳入realObject實例,然后在invoke方法中,我們使用Java反射機制技術,并在原始對象方法調用前后加入我們需要的操作。最后,我們使用Proxy.newProxyInstance方法來獲取代理實例。

總結

靜態代理和動態代理都是Java中常見的代理編程模型,但是兩者在實現方式上有所不同。靜態代理是在編寫期固定的代理方式,而動態代理是在運行期生成的代理方式。同時,動態代理又可以實現多個接口的方法代理,而靜態代理則需要為每個被代理對象單獨編寫代理類。