中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
临江市| 关岭| 胶州市| 驻马店市| 区。| 德化县| 怀仁县| 湘潭县| 会理县| 宁河县| 永康市| 桂阳县| 旅游| 赤水市| 定西市| 桃园市| 固阳县| 青川县| 时尚| 唐海县| 宁安市| 彝良县| 乌兰县| 旅游| 永昌县| 丰县| 松原市| 寿阳县| 威信县| 武隆县| 平乡县| 蓝田县| 南召县| 丹阳市| 曲水县| 洪雅县| 来安县| 砚山县| 宜春市| 喜德县| 江城|