JDK動態代理和CGLIB動態代理的區別

Mondo 科技 更新 2024-02-01

#JDK動力學和CGLIB動力學的區別

Spring AOP 中有兩種主要的動態方式,JDK 動態和 CGLIB 動態

JDK dynamic 只提供介面,不支援類。

1) JDK 將生成乙個動態類 $proxy*。在執行時class .

2)該類實現了目標類的介面,該類實現了介面的所有方法增強。

3)呼叫時,**類首先呼叫處理類進行增強,然後通過反射呼叫目標方法。從而實現AOP

如果類沒有實現介面,則 Spring AOP 選擇使用 CGLIB 來動態定位該類。

1)CGLIB的底層是通過ASM在執行時動態生成目標類的子類。(還有其他相關類,主要是為了提高呼叫時的效率)生成多個,

2)並且會覆蓋父類的所有方法進行增強,3)呼叫時,先通過類進行增強,然後直接呼叫父類的相應方法呼叫目標方法。從而實現AOP

CGLIB 通過繼承是動態的,因此如果乙個類被標記為 final,則無法使用 CGLIB 對其進行動畫處理。

除了生成目標子類之外,CGLIB 還有乙個 fastclass(路由類),該類可以(但不必)通過此類的方法呼叫進行擴充,而不會使 JDK 等方法呼叫增強功能失效。

很多人會比較JDK和CGLIB的效能,JDK動態生成類快,呼叫慢,CGLIB生成類慢,但後續呼叫。

速度快,在舊版本的 CGLIB 中比 JDK 快 10 倍左右,但實際上,每次版本公升級時,JDK 的速度都要高得多,而且。

CGLIB仍然步履蹣跚。

在JDK動態和CGLIB動態的實驗中,JDK7和8的動態效能在1W執行下比CGLIB好20%左右。

其他擴充套件。

1. 動態有什麼用**

他可以創造物件。

在原有**不變、原有不變的情況下,原有功能得到增強(有點像裝飾器模式)。

解耦允許您將業務功能與日誌分離。

二、兩種實現方式**

1) JDK動態**:

這是通過以下三個類實現的:proxy、method 和 invocationhandler。

要求目標類必須實現介面。

2)、CGLIB Dynamics**。

原則是繼承。

通過建立子類來重寫父類的方法,從而增強目標類方法。

3. JDK Dynamics** 演示**

開發步驟:建立目標類介面someservice

j**apackage com.mr.lee.service;

public interface someservice

override

public string doother()

為 InvocationHandler 介面建立乙個實現類,該介面實現對目標方法的增強。

j**apackage com.mr.lee.dao;

import j**a.lang.reflect.invocationhandler;

import j**a.lang.reflect.method;

實現 InvocationHandler 介面以增強目標方法的功能。

public class myinvocationhandler implements invocationhandler

override

public object invoke(object proxy, method method, object args) throws throwable

return method.invoke(target,args);等效於 someserviceimpldosome() 方法。

使用類似 jdk 的代理建立**物件,實現建立物件的能力。

j**apackage com.mr.lee;

import com.mr.lee.dao.myinvocationhandler;

import com.mr.lee.service.someservice;

import com.mr.lee.service.someserviceimpl;

import org.junit.test;

import org.springframework.context.applicationcontext;

import org.springframework.context.support.classpathxmlapplicationcontext;

import j**a.lang.reflect.invocationhandler;

import j**a.lang.reflect.proxy;

public class apptest

testpublic void shouldanswerwithtrue()

執行結果。 ``j**a

目前的執行方式是:dosome

當前執行時間:1664091059671

執行了 dosome 方法。

結束時間:1664091059671

目前的執行方式是:doother

執行了 doother 方法。

process finished with exit code 0

4. CGLIB新聞**。

APO的底層實現是動態的,AOP是動態的一種規範化。

原理是實現繼承:建立乙個子類,子類是**物件,目標類和方法一定不能是final的,

相關問題答案

    靜態 IP 代理怎麼樣,靜態 IP 和動態代理 IP 有什麼區別?

    在網際網絡時代,智財權已成為一種常見的網路工具。IP可以幫助我們隱藏自己的真實IP位址,提高上網的速度,也可以保護我們的私隱。其中,靜態IP和動態IP是兩種常用的方法。本文將解釋如何設定靜態 IP 以及它與動態 IP 的區別。.如何設定靜態IP .獲取靜態 IP 位址。您需要做的第一件事是獲取可用的...

    動態代理IP和靜態代理IP有什麼區別,適用場景有哪些?

    網際網絡行業的從業者經常使用一種工具,即第乙個智財權工具。動態IP和靜態IP是兩種常見的IP技術,在網路通訊中發揮著重要作用,比如大資料行業的從業者經常需要使用動態IP,跨境行業的從業者經常使用靜態IP。它們的主要功能是保護使用者IP位址的安全,但在實際應用中存在一些差異和各自的應用場景。本文將介紹...

    使用動態HTTP代理IP時需要注意什麼?

    隨著科技的進步和網際網絡的發展,越來越多的企業需要在業務中使用最好的,那麼我們在使用動態http ip時應該注意什麼呢?那麼就來給大家介紹一下 使用動態http ip時要注意什麼 .成本 一直是使用者選擇 服務時的重要標準,但重要的是要知道,成本往往與服務質量掛鉤,在兩者之間取得平衡的同時,要找到滿...

    動態代理IP如何保障網路安全?

    隨著網際網絡的快速發展,網路安全和接入效率已成為人們日常生活中不可忽視的重要問題。動態IP作為一種常見的網路工具,不僅可以保證個人私隱和網路安全,還可以提高網頁瀏覽的速度,已成為現代社會不可或缺的重要工具。動態IP,顧名思義,是指可以動態更改IP位址的伺服器。它通過連線到伺服器並在使用者和目標之間中...

    為什麼動態IP代理是私隱保護工具?

    在當今資訊飛速發展的時代,網際網絡已成為人們生活中不可或缺的一部分。然而,隨之而來的網路安全問題也越來越突出。為了保護個人私隱和資料安全,動態IP 已成為重要的網路工具。動態IP 顧名思義,是一種可以動態更改IP位址的伺服器。它通過將使用者的網路請求傳送到伺服器,然後將伺服器傳送到目標來隱藏使用者的...