使用cglib创建代理对象
在上一篇文章中,我討論了基于標準Java的代理對象。 當您要在實現接口的對象上具有方法調用處理程序時,可以使用這些方法。 Java反射代理的創建要求您具有一個實現接口的對象。 我們要代理的對象已經失控,它沒有實現我們要從處理程序調用的接口,而我們仍然希望擁有代理。
什么時候需要不帶接口的對象的代理?
這是很常見的情況。 如果有的話,我們有一個JPA實現,例如Hibernate,它實現了記錄的延遲加載。 例如,審核日志記錄存儲在一個表中,并且每個記錄(第一個記錄除外)都引用了上一項。 就像是
class LinkedAuditLogRecord {LinkedAuditLogRecord previous;AuditLogRecord actualRecord; }通過JPA加載記錄將返回一個對象LinkedAuditLogRecord ,該對象包含以前的記錄作為對象,依此類推,直到第一個在名為previos的字段中可能為null記錄為止。 (這不是實際的代碼。)任何JPA實現從一開始就抓取并加載整個表到我們感興趣的記錄都是一個非常糟糕的實現。 相反,持久層僅加載實際記錄,并創建一個擴展LinkedAuditLogRecord的代理對象,而這就是previous字段的內容。 實際字段通常是私有字段,如果我們的代碼嘗試訪問上一條記錄,則代理對象將在該時間加載它。 簡而言之,這是延遲加載。
但是,JPA實現如何為未實現接口的類的對象創建代理? Java反射代理實現無法做到這一點,因此JPA實現使用了不同的東西。 他們通常使用的是cglib。
什么是cglib
Cglib是一個開放源代碼庫,能夠在Java運行時創建和加載內存中的類文件。 為此,它使用Java字節碼生成庫'asm',這是一個非常低級的字節碼創建工具。 我不會在本文中深入探討。
如何使用cglib
使用cglib創建代理對象幾乎與使用JDK反射代理API一樣簡單。 我使用cglib創建了與上周文章相同的代碼:
package proxy;import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibProxyDemo {static class Original {public void originalMethod(String s) {System.out.println(s);}}static class Handler implements MethodInterceptor {private final Original original;public Handler(Original original) {this.original = original;}public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("BEFORE");method.invoke(original, args);System.out.println("AFTER");return null;}}public static void main(String[] args){Original original = new Original();MethodInterceptor handler = new Handler(original);Original f = (Original) Enhancer.create(Original.class,handler);f.originalMethod("Hallo");} }區別在于類的名稱略有不同,并且我們沒有接口。
代理類擴展原始類也很重要,因此在創建代理對象時,它將調用原始類的構造函數。 如果這是資源匱乏的話,我們可能會有一些問題。 但是,這是我們不能回避的事情。 如果我們想為一個已經存在的類提供一個代理對象,那么我們應該有一個接口,或者我們必須擴展原始類,否則我們就不能使用代理對象代替原始類。
翻譯自: https://www.javacodegeeks.com/2016/01/creating-proxy-object-using-cglib.html
總結
以上是生活随笔為你收集整理的使用cglib创建代理对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SWT ScrolledComposit
- 下一篇: 外设厂推出 Switch 游戏机用扩展屏