亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

java動態代理怎么實現

小億
88
2023-11-08 14:40:03
欄目: 編程語言

Java動態代理可以通過以下幾種方式實現:

  1. 使用java.lang.reflect.Proxy類:Proxy類提供了一個靜態方法newProxyInstance(),可以通過傳入目標對象的類加載器、目標對象實現的接口和InvocationHandler接口的實現類來創建代理對象。InvocationHandler接口的實現類負責處理代理對象的方法調用。代理對象在調用方法時,會把方法調用轉發給InvocationHandlerinvoke()方法,從而實現代理功能。
public interface Subject {
    void doSomething();
}

public class RealSubject implements Subject {
    public void doSomething() {
        System.out.println("RealSubject doSomething");
    }
}

public class MyInvocationHandler implements InvocationHandler {
    private Subject target;

    public MyInvocationHandler(Subject target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method invoke");
        Object result = method.invoke(target, args);
        System.out.println("After method invoke");
        return result;
    }
}

public class Main {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();
        Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                new MyInvocationHandler(realSubject));
        proxySubject.doSomething();
    }
}
  1. 使用CGLib庫:CGLib是一個基于ASM框架的字節碼生成庫,它可以在運行時動態生成目標對象的子類,并覆蓋其中的方法以實現代理功能。
public interface Subject {
    void doSomething();
}

public class RealSubject implements Subject {
    public void doSomething() {
        System.out.println("RealSubject doSomething");
    }
}

public class MyMethodInterceptor implements MethodInterceptor {
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method invoke");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("After method invoke");
        return result;
    }
}

public class Main {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new MyMethodInterceptor());
        Subject proxySubject = (Subject) enhancer.create();
        proxySubject.doSomething();
    }
}

需要注意的是,使用CGLib實現動態代理時,目標對象不能是final類或者包含final方法,因為CGLib是通過生成目標對象的子類來實現代理的。

  1. 使用ByteBuddy庫:ByteBuddy是一個輕量級的字節碼操作庫,它可以在運行時動態生成目標對象的子類,并覆蓋其中的方法以實現代理功能。
public interface Subject {
    void doSomething();
}

public class RealSubject implements Subject {
    public void doSomething() {
        System.out.println("RealSubject doSomething");
    }
}

public class MyInterceptor implements MethodInterceptor {
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method invoke");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("After method invoke");
        return result;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<? extends Subject> proxyClass = new ByteBuddy()
                .subclass(Subject.class)
                .method(any()).intercept(MethodDelegation.to(MyInterceptor.class))
                .make()
                .load(RealSubject.class.getClassLoader())
                .getLoaded();
        Subject proxySubject = proxyClass.getDeclaredConstructor().newInstance();
        proxySubject.doSomething();
    }
}

需要注意的是,使用ByteBuddy實現動態代理時,需要引入net.bytebuddy:byte-buddynet.bytebuddy:byte-buddy-agent兩個依賴。

0
金川县| 鹿邑县| 平邑县| 宝兴县| 台安县| 沽源县| 耒阳市| 上饶县| 云林县| 岑溪市| 吕梁市| 扶风县| 调兵山市| 宣威市| 休宁县| 乐亭县| 龙游县| 德令哈市| 石家庄市| 潮安县| 腾冲县| 阿坝| 宁明县| 三亚市| 陈巴尔虎旗| 永和县| 武夷山市| 西峡县| 胶南市| 黑龙江省| 宝应县| 乌鲁木齐市| 成安县| 宣威市| 西华县| 娄烦县| 靖州| 随州市| 昔阳县| 合江县| 特克斯县|