偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入探討Java中的JDK代理與CGLIB代理

開發(fā) 前端
JDK代理和CGLIB代理各有優(yōu)缺點(diǎn),根據(jù)實(shí)際需求選擇合適的代理方式是至關(guān)重要的。在項(xiàng)目中,有時(shí)也會(huì)結(jié)合兩者使用,以充分發(fā)揮各自的優(yōu)勢(shì)。希望本文能夠幫助讀者更深入地理解和使用JDK代理與CGLIB代理。

在Java開發(fā)中,代理是一種常見的設(shè)計(jì)模式,它可以為我們提供一種靈活的方式來控制對(duì)象的訪問和操作。在代理模式中,JDK代理與CGLIB代理是兩種常用的實(shí)現(xiàn)方式,它們分別基于Java動(dòng)態(tài)代理和CGLIB字節(jié)碼生成技術(shù)。本文將深入探討這兩種代理方式的原理、特點(diǎn)以及使用場(chǎng)景。

JDK代理

JDK代理是Java動(dòng)態(tài)代理的一種典型實(shí)現(xiàn)方式。它基于Java反射機(jī)制,在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理類和實(shí)例。JDK代理要求被代理的類必須實(shí)現(xiàn)一個(gè)或多個(gè)接口,代理類會(huì)實(shí)現(xiàn)這些接口并在方法調(diào)用前后插入額外的邏輯。下面是一個(gè)簡(jiǎn)單的JDK代理示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


interface Subject {
    void request();
}


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


class DynamicProxy implements InvocationHandler {
    private Object target;


    public DynamicProxy(Object target) {
        this.target = target;
    }


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


public class ProxyTest {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        InvocationHandler handler = new DynamicProxy(realSubject);


        Subject proxySubject = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                handler
        );


        proxySubject.request();
    }
}

CGLIB代理

CGLIB(Code Generation Library)代理是另一種常見的代理方式,它不要求被代理的類實(shí)現(xiàn)接口,而是通過生成目標(biāo)類的子類來實(shí)現(xiàn)代理。CGLIB利用字節(jié)碼生成技術(shù),通過修改字節(jié)碼的方式在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建代理類。下面是一個(gè)簡(jiǎn)單的CGLIB代理示例:

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.Enhancer;


class RealSubject {
    public void request() {
        System.out.println("RealSubject - Request");
    }
}


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


public class ProxyTest {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new DynamicProxy());


        RealSubject proxySubject = (RealSubject) enhancer.create();
        proxySubject.request();
    }
}

JDK代理與CGLIB代理的比較

  1. 實(shí)現(xiàn)方式: JDK代理基于接口,要求目標(biāo)類實(shí)現(xiàn)接口;而CGLIB代理通過繼承目標(biāo)類生成子類。
  2. 性能: JDK代理在創(chuàng)建代理對(duì)象時(shí)相對(duì)較慢,因?yàn)樗枰瓷浜蛯?shí)現(xiàn)接口;而CGLIB代理在創(chuàng)建對(duì)象時(shí)更快,因?yàn)樗苯由勺止?jié)碼。
  3. 目標(biāo)類要求: JDK代理要求目標(biāo)類實(shí)現(xiàn)接口,不適用于沒有接口的類;而CGLIB代理可以代理沒有實(shí)現(xiàn)接口的類。
  4. 內(nèi)存占用: JDK代理生成的代理類較輕量,占用內(nèi)存相對(duì)較少;而CGLIB代理生成的子類可能較重,占用內(nèi)存相對(duì)較多。

使用場(chǎng)景

  1. JDK代理適用于:
  • 目標(biāo)類實(shí)現(xiàn)了接口。
  • 代理類不需要對(duì)目標(biāo)類進(jìn)行增強(qiáng)的情況。
  1. CGLIB代理適用于:
  • 目標(biāo)類沒有實(shí)現(xiàn)接口。

  • 需要對(duì)目標(biāo)類進(jìn)行增強(qiáng),例如在目標(biāo)方法前后插入額外的邏輯。

總的來說,JDK代理和CGLIB代理各有優(yōu)缺點(diǎn),根據(jù)實(shí)際需求選擇合適的代理方式是至關(guān)重要的。在項(xiàng)目中,有時(shí)也會(huì)結(jié)合兩者使用,以充分發(fā)揮各自的優(yōu)勢(shì)。希望本文能夠幫助讀者更深入地理解和使用JDK代理與CGLIB代理。

責(zé)任編輯:武曉燕 來源: 柳岸花開
相關(guān)推薦

2023-12-06 08:23:44

代理模式設(shè)計(jì)模式

2025-02-27 00:32:35

2022-09-01 10:40:29

SpringAOPJDK

2017-05-10 21:28:00

Java異常與錯(cuò)誤處理

2024-01-24 08:31:13

extends?接口規(guī)范

2021-04-22 09:58:15

JDK代理動(dòng)態(tài)

2023-10-23 12:35:36

Golang追加操作

2024-12-26 01:07:13

2009-12-14 13:33:49

Ruby與Python

2009-12-23 16:13:00

WPF Attache

2020-10-25 17:11:29

JDK代理監(jiān)控

2011-02-25 09:23:00

Java類加載器

2015-09-02 08:57:56

JavaHashMap工作原理

2024-01-25 11:42:00

C++編程指針常量

2010-03-31 14:58:03

云計(jì)算

2010-11-22 14:18:32

MySQL鎖機(jī)制

2010-07-21 09:38:15

PHP緩存技術(shù)

2009-12-07 16:07:03

PHP類的繼承

2009-06-16 10:51:14

Java源碼

2009-11-20 17:17:08

Oracle函數(shù)索引
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)