91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

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
梁山县| 庆城县| 广宁县| 宜丰县| 河北区| 志丹县| 桃江县| 鹤山市| 额尔古纳市| 大港区| 福清市| 乡城县| 涞源县| 登封市| 崇礼县| 张家港市| 信宜市| 陵川县| 岳阳市| 广昌县| 凌云县| 德阳市| 奇台县| 彭阳县| 西宁市| 比如县| 岑溪市| 界首市| 盘山县| 深泽县| 乐昌市| 交城县| 嘉峪关市| 登封市| 乌鲁木齐县| 美姑县| 临猗县| 沈丘县| 东城区| 兴山县| 华池县|