色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

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

趙永秀1年前9瀏覽0評論

Java代理模式是一種常見的設計模式,它允許您以代理的形式訪問某個對象。Java代理代表原始對象并向客戶端提供其所有功能。Java代理可以分為靜態代理和動態代理兩種類型,它們之間存在著一些重要的區別。

靜態代理

public interface Car {
void drive();
}
public class CarImpl implements Car {
public void drive() {
System.out.println("Driving the car...");
}
}
public class CarProxy implements Car {
private Car car;
public CarProxy(Car car) {
this.car = car;
}
public void drive() {
System.out.println("Before driving, check if the car is available.");
car.drive();
System.out.println("After driving, refueling is required.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new CarProxy(new CarImpl());
car.drive();
}
}

靜態代理可以在編譯期間生成代理類,代理類和委托類都實現同一接口,委托類實現業務邏輯方法,而代理類通常在業務邏輯方法前或后添加一些邏輯操作,如權限控制、事務處理等。

動態代理

public interface Car {
void drive();
}
public class CarImpl implements Car {
public void drive() {
System.out.println("Driving the car...");
}
}
public class CarHandler implements InvocationHandler {
private Object target;
public CarHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before driving, check if the car is available.");
Object result = method.invoke(target, args);
System.out.println("After driving, refueling is required.");
return result;
}
}
public class Main {
public static void main(String[] args) {
Car car = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(),
new Class[]{Car.class},
new CarHandler(new CarImpl()));
car.drive();
}
}

動態代理不需要在編譯期間生成代理類,代理類是在程序運行期間動態生成的,通過反射機制實現。動態代理通常不需要像靜態代理一樣手動編寫代理類,只需要實現InvocationHandler類,實現invoke方法,在該方法中調用委托類的方法,并在方法前后添加邏輯操作。

總體來說,靜態代理適用于只有少量對象需要代理的情況下,因為每個委托類都需要編寫一個代理類,而動態代理適用于代理對象較多的情況,因為它可以動態生成代理類,簡化了代理類的開發。