CGlib簡單介紹

CGlib簡單介紹

CGlib概述:
cglib(Code Generation Library)是一個強大的,高性能,高質量的Code生成類庫。它能夠在運行期擴展Java類與實現Java接口。
cglib封裝了asm,能夠在運行期動態生成新的class。
cglib用於AOP,jdk中的proxy必須基於接口,cglib卻沒有這個限制。

CGlib應用:
以一個實例在簡單介紹下cglib的應用。
咱們模擬一個虛擬的場景,關於信息的管理。

1)原始需求是任何人能夠操做信息的create,update,delete,query操做。
InfoManager.java--封裝對信息的操做
html

public class InfoManager {
    // 模擬查詢操做
    public void query() {
        System.out.println("query");
    }
    // 模擬建立操做
    public void create() {
        System.out.println("create");
    }
    // 模擬更新操做
    public void update() {
        System.out.println("update");
    }
    // 模擬刪除操做
    public void delete() {
        System.out.println("delete");
    }
}java

InfoManagerFactory.java--工廠類
spring

public class InfoManagerFactory {
    private static InfoManager manger = new InfoManager();
    /**
     * 建立原始的InfoManager
     * 
     * 
@return
     
*/
    public static InfoManager getInstance() {
        return manger;
    }
}框架

client.java--供客戶端調用
ide

public class Client {

    public static void main(String[] args) {
        Client c = new Client();
        c.anyonecanManager();
    }

    /**
     * 模擬:沒有任何權限要求,任何人均可以操做
     
*/
    public void anyonecanManager() {
        System.out.println("any one can do manager");
        InfoManager manager = InfoManagerFactory.getInstance();
        doCRUD(manager);
        separatorLine();
    }

    /**
     * 對Info作增長/更新/刪除/查詢操做
     * 
     * 
@param  manager
     
*/
    private void doCRUD(InfoManager manager) {
        manager.create();
        manager.update();
        manager.delete();
        manager.query();
    }

    /**
     * 加一個分隔行,用於區分
     
*/
    private void separatorLine() {
        System.out.println("################################");
    }

}函數

至此,沒有涉及到cglib的內容,由於需求太簡單了,可是接下來,需求發生了改變,要求:

2)只有一個叫「maurice」的用戶登陸,才容許對信息進行create,update,delete,query的操做。
怎麼辦?難道在每一個方法前,都加上一個權限判斷嗎?這樣重複邏輯太多了,因而乎想到了Proxy(代理模式),可是原先的InfoManager也沒有實現接口,不能採用jdk的proxy。那麼cglib在這邊就要隆重登場。
一旦使用cgblig,只須要添加一個MethodInterceptor的類以及修改factory代碼就能夠實現這個需求。
AuthProxy.java--權限校驗代理類
性能

public class AuthProxy implements MethodInterceptor {

    private String name; // 會員登陸名

    public AuthProxy(String name) {
        this.name = name;
    }

    /**
     * 權限校驗,若是會員名爲:maurice,則有權限作操做,不然提示沒有權限
     
*/
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        if (!"maurice".equals(this.name)) {
            System.out.println("AuthProxy:you have no permits to do manager!");
            return null;
        }
        return proxy.invokeSuper(obj, args);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}this

InfoManagerFactory.java--代碼變更以下:
spa

public class InfoManagerFactory {

    /**
     * 建立帶有權限檢驗的InfoManager
     * 
     * 
@param  auth
     * 
@return
     
*/
    public static InfoManager getAuthInstance(AuthProxy auth) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(InfoManager.class);
        enhancer.setCallback(auth);
        return (InfoManager) enhancer.create();
    }

    
}
.net

client.java--代碼修改以下

public class Client {

    public static void main(String[] args) {
        Client c = new Client();
        c.haveNoAuthManager();
        c.haveAuthManager();
    }

    /**
     * 模擬:登陸會員沒有權限
     
*/
    public void haveNoAuthManager() {
        System.out.println("the loginer's name is not maurice,so have no permits do manager");
        InfoManager noAuthManager = InfoManagerFactory.getAuthInstance(new AuthProxy("maurice1"));
        doCRUD(noAuthManager);
        separatorLine();
    }

    /**
     * 模擬:登陸會員有權限
     
*/
    public void haveAuthManager() {
        System.out.println("the loginer's name is maurice,so have permits do manager");
        InfoManager authManager = InfoManagerFactory.getAuthInstance(new AuthProxy("maurice"));
        doCRUD(authManager);
        separatorLine();
    }

    /**
     * 對Info作增長/更新/刪除/查詢操做
     * 
     * 
@param manager
     
*/
    private void doCRUD(InfoManager manager) {
        manager.create();
        manager.update();
        manager.delete();
        manager.query();
    }

    /**
     * 加一個分隔行,用於區分
     
*/
    private void separatorLine() {
        System.out.println("################################");
    }

}

執行下代碼,發現這時client端中已經加上了權限校驗。
一樣是InfoManager,爲何這時能多了權限的判斷呢?Factory中enhancer.create()返回的究竟是什麼對象呢?這個疑問將在第三部分CGlib中解釋。
這邊的代碼,實際上是介紹了cglib中的enhancer功能.

到這裏,參照上面的代碼,就可使用cglib帶來的aop功能了。可是爲了更多介紹下cglib的功能,模擬需求再次發生變化:

3)因爲query功能用戶maurice才能使用,招來其餘用戶的強烈的抱怨,因此權限再次變動,只有create,update,delete,才須要權限保護,query任何人均可以使用。
怎麼辦?採用AuthProxy,使得InfoManager中的全部方法都被代理,加上了權限的判斷。固然,最容易想到的辦法,就是在AuthProxy的intercept的方法中再作下判斷,若是代理的method是query,不須要權限驗證。這麼作,能夠,可是一旦邏輯比較複雜的時候,intercept這個方法要作的事情會不少,邏輯會異常的複雜。
幸虧,cglib還提供了CallbackFilter。使用CallbackFilter,能夠明確代表,被代理的類(InfoManager)中不一樣的方法,被哪一個攔截器(interceptor)攔截。
AuthProxyFilter.java

public class AuthProxyFilter implements CallbackFilter {

    private static final int AUTH_NEED     = 0;
    private static final int AUTH_NOT_NEED = 1;

    /**
     * <pre>
     * 選擇使用的proxy
     * 若是調用query函數,則使用第二個proxy
     * 不然,使用第一個proxy
     * </pre>
     
*/
    @Override
    public int accept(Method method) {
        if ("query".equals(method.getName())) {
            return AUTH_NOT_NEED;
        }
        return AUTH_NEED;
    }

}

這段代碼什麼意思?其中的accept方法的意思是說,若是代理的方法是query(),那麼使用第二個攔截器去攔截,若是代理的方法不是query(),那麼使用第一個攔截器去攔截。因此咱們只要再寫一個攔截器,不作權限校驗就好了。(其實,cglib中的NoOp.INSTANCE就是一個空的攔截器,只要配置上這個就能夠了。)
InfoManagerFactory.java--代碼修改以下:(配置不一樣的攔截器和filter)

public class InfoManagerFactory {

    /**
     * 建立不一樣權限要求的InfoManager
     * 
     * 
@param auth
     * 
@return
     
*/
    public static InfoManager getSelectivityAuthInstance(AuthProxy auth) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(InfoManager.class);
        enhancer.setCallbacks(new Callback[] { auth, NoOp.INSTANCE });
        enhancer.setCallbackFilter(new AuthProxyFilter());
        return (InfoManager) enhancer.create();
    }

}

記住:setCallbacks中的攔截器(interceptor)的順序,必定要和CallbackFilter裏面指定的順序一致!!切忌。

Client.java

public class Client {

    public static void main(String[] args) {
        Client c = new Client();
        c.selectivityAuthManager();
    }
    
    /**
     * 模擬:沒有權限的會員,能夠做查詢操做
     
*/
    public void selectivityAuthManager() {
        System.out.println("the loginer's name is not maurice,so have no permits do manager except do query operator");
        InfoManager authManager = InfoManagerFactory.getSelectivityAuthInstance(new AuthProxy("maurice1"));
        doCRUD(authManager);
        separatorLine();
    }

    /**
     * 對Info作增長/更新/刪除/查詢操做
     * 
     * 
@param manager
     
*/
    private void doCRUD(InfoManager manager) {
        manager.create();
        manager.update();
        manager.delete();
        manager.query();
    }

    /**
     * 加一個分隔行,用於區分
     
*/
    private void separatorLine() {
        System.out.println("################################");
    }

}

此時,對於query的權限校驗已經被去掉了。


經過一個模擬需求,簡單介紹了cglib aop功能的使用。
CGlib應用很是廣,在spring,hibernate等框架中,被大量的使用。


CGlib原理:
cglib神奇嗎?其實一旦瞭解cglib enhancer的原理,一切就真相大白了。
剛纔在第二部分中,有個疑問:enhancer.create()到底返回了什麼對象?

其實在剛纔的例子中,cglib在代碼運行期,動態生成了InfoManager的子類,而且根據CallbackFilter的accept方法,覆寫了InfoManager中的全部方法--去執行相應的MethodInterceptor的intercept方法。

有興趣的朋友能夠看看我反編譯的InfoManager的子類,就能夠很明白知道具體的實現了。(須要有耐心才能夠)
InfoManager$$EnhancerByCGLIB$$de624598.jad

// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   <generated>

package cn.eulic.codelab.cglib;

import java.lang.reflect.Method;
import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy.*;

// Referenced classes of package cn.eulic.codelab.cglib:
//            InfoManager

public class CGLIB.BIND_CALLBACKS extends InfoManager
    implements Factory
{

    static void CGLIB$STATICHOOK1()
    {
        Class class1;
        ClassLoader classloader;
        CGLIB$THREAD_CALLBACKS = new ThreadLocal();
        classloader = (class1 = Class.forName("cn.eulic.codelab.cglib.InfoManager$$EnhancerByCGLIB$$de624598")).getClassLoader();
        classloader;
        CGLIB$emptyArgs = new Object[0];
        CGLIB$delete$0$Proxy = MethodProxy.create(classloader, (CGLIB$delete$0$Method = Class.forName("cn.eulic.codelab.cglib.InfoManager").getDeclaredMethod("delete", new Class[0])).getDeclaringClass(), class1, "()V", "delete", "CGLIB$delete$0");
        CGLIB$create$1$Proxy = MethodProxy.create(classloader, (CGLIB$create$1$Method = Class.forName("cn.eulic.codelab.cglib.InfoManager").getDeclaredMethod("create", new Class[0])).getDeclaringClass(), class1, "()V", "create", "CGLIB$create$1");
        CGLIB$query$2$Proxy = MethodProxy.create(classloader, (CGLIB$query$2$Method = Class.forName("cn.eulic.codelab.cglib.InfoManager").getDeclaredMethod("query", new Class[0])).getDeclaringClass(), class1, "()V", "query", "CGLIB$query$2");
        CGLIB$update$3$Proxy = MethodProxy.create(classloader, (CGLIB$update$3$Method = Class.forName("cn.eulic.codelab.cglib.InfoManager").getDeclaredMethod("update", new Class[0])).getDeclaringClass(), class1, "()V", "update", "CGLIB$update$3");
        CGLIB$finalize$4$Proxy = MethodProxy.create(classloader, (CGLIB$finalize$4$Method = Class.forName("java.lang.Object").getDeclaredMethod("finalize", new Class[0])).getDeclaringClass(), class1, "()V", "finalize", "CGLIB$finalize$4");
        CGLIB$hashCode$5$Proxy = MethodProxy.create(classloader, (CGLIB$hashCode$5$Method = Class.forName("java.lang.Object").getDeclaredMethod("hashCode", new Class[0])).getDeclaringClass(), class1, "()I", "hashCode", "CGLIB$hashCode$5");
        CGLIB$clone$6$Proxy = MethodProxy.create(classloader, (CGLIB$clone$6$Method = Class.forName("java.lang.Object").getDeclaredMethod("clone", new Class[0])).getDeclaringClass(), class1, "()Ljava/lang/Object;", "clone", "CGLIB$clone$6");
        CGLIB$equals$7$Proxy = MethodProxy.create(classloader, (CGLIB$equals$7$Method = Class.forName("java.lang.Object").getDeclaredMethod("equals", new Class[] {
            Class.forName("java.lang.Object")
        })).getDeclaringClass(), class1, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$7");
        CGLIB$toString$8$Proxy = MethodProxy.create(classloader, (CGLIB$toString$8$Method = Class.forName("java.lang.Object").getDeclaredMethod("toString", new Class[0])).getDeclaringClass(), class1, "()Ljava/lang/String;", "toString", "CGLIB$toString$8");
        return;
    }

    final void CGLIB$delete$0()
    {
        super.delete();
    }

    public final void delete()
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 37;
           goto _L3 _L4
_L3:
        break MISSING_BLOCK_LABEL_21;
_L4:
        break MISSING_BLOCK_LABEL_37;
        this;
        CGLIB$delete$0$Method;
        CGLIB$emptyArgs;
        CGLIB$delete$0$Proxy;
        intercept();
        return;
        super.delete();
        return;
    }

    final void CGLIB$create$1()
    {
        super.create();
    }

    public final void create()
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 37;
           goto _L3 _L4
_L3:
        break MISSING_BLOCK_LABEL_21;
_L4:
        break MISSING_BLOCK_LABEL_37;
        this;
        CGLIB$create$1$Method;
        CGLIB$emptyArgs;
        CGLIB$create$1$Proxy;
        intercept();
        return;
        super.create();
        return;
    }

    final void CGLIB$query$2()
    {
        super.query();
    }

    public final void query()
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 37;
           goto _L3 _L4
_L3:
        break MISSING_BLOCK_LABEL_21;
_L4:
        break MISSING_BLOCK_LABEL_37;
        this;
        CGLIB$query$2$Method;
        CGLIB$emptyArgs;
        CGLIB$query$2$Proxy;
        intercept();
        return;
        super.query();
        return;
    }

    final void CGLIB$update$3()
    {
        super.update();
    }

    public final void update()
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 37;
           goto _L3 _L4
_L3:
        break MISSING_BLOCK_LABEL_21;
_L4:
        break MISSING_BLOCK_LABEL_37;
        this;
        CGLIB$update$3$Method;
        CGLIB$emptyArgs;
        CGLIB$update$3$Proxy;
        intercept();
        return;
        super.update();
        return;
    }

    final void CGLIB$finalize$4()
        throws Throwable
    {
        super.finalize();
    }

    protected final void finalize()
        throws Throwable
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 37;
           goto _L3 _L4
_L3:
        break MISSING_BLOCK_LABEL_21;
_L4:
        break MISSING_BLOCK_LABEL_37;
        this;
        CGLIB$finalize$4$Method;
        CGLIB$emptyArgs;
        CGLIB$finalize$4$Proxy;
        intercept();
        return;
        super.finalize();
        return;
    }

    final int CGLIB$hashCode$5()
    {
        return super.hashCode();
    }

    public final int hashCode()
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 52;
           goto _L3 _L4
_L3:
        this;
        CGLIB$hashCode$5$Method;
        CGLIB$emptyArgs;
        CGLIB$hashCode$5$Proxy;
        intercept();
        JVM INSTR dup ;
        JVM INSTR ifnonnull 45;
           goto _L5 _L6
_L5:
        JVM INSTR pop ;
        0;
          goto _L7
_L6:
        (Number);
        intValue();
_L7:
        return;
_L4:
        return super.hashCode();
    }

    final Object CGLIB$clone$6()
        throws CloneNotSupportedException
    {
        return super.clone();
    }

    protected final Object clone()
        throws CloneNotSupportedException
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 37;
           goto _L3 _L4
_L3:
        this;
        CGLIB$clone$6$Method;
        CGLIB$emptyArgs;
        CGLIB$clone$6$Proxy;
        intercept();
        return;
_L4:
        return super.clone();
    }

    final boolean CGLIB$equals$7(Object obj)
    {
        return super.equals(obj);
    }

    public final boolean equals(Object obj)
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 57;
           goto _L3 _L4
_L3:
        this;
        CGLIB$equals$7$Method;
        new Object[] {
            obj
        };
        CGLIB$equals$7$Proxy;
        intercept();
        JVM INSTR dup ;
        JVM INSTR ifnonnull 50;
           goto _L5 _L6
_L5:
        JVM INSTR pop ;
        false;
          goto _L7
_L6:
        (Boolean);
        booleanValue();
_L7:
        return;
_L4:
        return super.equals(obj);
    }

    final String CGLIB$toString$8()
    {
        return super.toString();
    }

    public final String toString()
    {
        CGLIB$CALLBACK_0;
        if(CGLIB$CALLBACK_0 != nullgoto _L2; else goto _L1
_L1:
        JVM INSTR pop ;
        CGLIB$BIND_CALLBACKS(this);
        CGLIB$CALLBACK_0;
_L2:
        JVM INSTR dup ;
        JVM INSTR ifnull 40;
           goto _L3 _L4
_L3:
        this;
        CGLIB$toString$8$Method;
        CGLIB$emptyArgs;
        CGLIB$toString$8$Proxy;
        intercept();
        (String);
        return;
_L4:
        return super.toString();
    }

    public static MethodProxy CGLIB$findMethodProxy(Signature signature)
    {
        String s = signature.toString();
        s;
        s.hashCode();
        JVM INSTR lookupswitch 9: default 200
    //                   -1949253108: 92
    
//                   -1574182249: 104
    
//                   -1166709331: 116
    
//                   -508378822: 128
    
//                   -358764054: 140
    
//                   598313209: 152
    
//                   1826985398: 164
    
//                   1913648695: 176
    
//                   1984935277: 188;
           goto _L1 _L2 _L3 _L4 _L5 _L6 _L7 _L8 _L9 _L10
_L2:
        "update()V";
        equals();
        JVM INSTR ifeq 201;
           goto _L11 _L12
_L12:
        break MISSING_BLOCK_LABEL_201;
_L11:
        return CGLIB$update$3$Proxy;
_L3:
        "finalize()V";
        equals();
        JVM INSTR ifeq 201;
           goto _L13 _L14
_L14:
        break MISSING_BLOCK_LABEL_201;
_L13:
        return CGLIB$finalize$4$Proxy;
_L4:
        "query()V";
        equals();
        JVM INSTR ifeq 201;
           goto _L15 _L16
_L16:
        break MISSING_BLOCK_LABEL_201;
_L15:
        return CGLIB$query$2$Proxy;
_L5:
        "clone()Ljava/lang/Object;";
        equals();
        JVM INSTR ifeq 201;
           goto _L17 _L18
_L18:
        break MISSING_BLOCK_LABEL_201;
_L17:
        return CGLIB$clone$6$Proxy;
_L6:
        "delete()V";
        equals();
        JVM INSTR ifeq 201;
           goto _L19 _L20
_L20:
        break MISSING_BLOCK_LABEL_201;
_L19:
        return CGLIB$delete$0$Proxy;
_L7:
        "create()V";
        equals();
        JVM INSTR ifeq 201;
           goto _L21 _L22
_L22:
        break MISSING_BLOCK_LABEL_201;
_L21:
        return CGLIB$create$1$Proxy;
_L8:
        "equals(Ljava/lang/Object;)Z";
        equals();
        JVM INSTR ifeq 201;
           goto _L23 _L24
_L24:
        break MISSING_BLOCK_LABEL_201;
_L23:
        return CGLIB$equals$7$Proxy;
_L9:
        "toString()Ljava/lang/String;";
        equals();
        JVM INSTR ifeq 201;
           goto _L25 _L26
_L26:
        break MISSING_BLOCK_LABEL_201;
_L25:
        return CGLIB$toString$8$Proxy;
_L10:
        "hashCode()I";
        equals();
        JVM INSTR ifeq 201;
           goto _L27 _L28
_L28:
        break MISSING_BLOCK_LABEL_201;
_L27:
        return CGLIB$hashCode$5$Proxy;
_L1:
        JVM INSTR pop ;
        return null;
    }

    public static void CGLIB$SET_THREAD_CALLBACKS(Callback acallback[])
    {
        CGLIB$THREAD_CALLBACKS.set(acallback);
    }

    public static void CGLIB$SET_STATIC_CALLBACKS(Callback acallback[])
    {
        CGLIB$STATIC_CALLBACKS = acallback;
    }

    private static final void CGLIB$BIND_CALLBACKS(Object obj)
    {
        CGLIB.STATIC_CALLBACKS static_callbacks = (CGLIB.STATIC_CALLBACKS)obj;
        if(static_callbacks.CGLIB$BOUND) goto _L2; else goto _L1
_L1:
        Object obj1;
        static_callbacks.CGLIB$BOUND = true;
        obj1 = CGLIB$THREAD_CALLBACKS.get();
        obj1;
        if(obj1 != nullgoto _L4; else goto _L3
_L3:
        JVM INSTR pop ;
        CGLIB$STATIC_CALLBACKS;
        if(CGLIB$STATIC_CALLBACKS != nullgoto _L4; else goto _L5
_L5:
        JVM INSTR pop ;
          goto _L2
_L4:
        (Callback[]);
        static_callbacks;
        JVM INSTR swap ;
        0;
        JVM INSTR aaload ;
        (MethodInterceptor);
        CGLIB$CALLBACK_0;
_L2:
    }

    public Object newInstance(Callback acallback[])
    {
        CGLIB$SET_THREAD_CALLBACKS(acallback);
        CGLIB$SET_THREAD_CALLBACKS(null);
        return new <init>();
    }

    public Object newInstance(Callback callback)
    {
        CGLIB$SET_THREAD_CALLBACKS(new Callback[] {
            callback
        });
        CGLIB$SET_THREAD_CALLBACKS(null);
        return new <init>();
    }

    public Object newInstance(Class aclass[], Object aobj[], Callback acallback[])
    {
        CGLIB$SET_THREAD_CALLBACKS(acallback);
        JVM INSTR new #2   <Class InfoManager$$EnhancerByCGLIB$$de624598>;
        JVM INSTR dup ;
        aclass;
        aclass.length;
        JVM INSTR tableswitch 0 0: default 35
    //                   0 28;
           goto _L1 _L2
_L2:
        JVM INSTR pop ;
        <init>();
          goto _L3
_L1:
        JVM INSTR pop ;
        throw new IllegalArgumentException("Constructor not found");
_L3:
        CGLIB$SET_THREAD_CALLBACKS(null);
        return;
    }

    public Callback getCallback(int i)
    {
        CGLIB$BIND_CALLBACKS(this);
        this;
        i;
        JVM INSTR tableswitch 0 0: default 30
    //                   0 24;
           goto _L1 _L2
_L2:
        CGLIB$CALLBACK_0;
          goto _L3
_L1:
        JVM INSTR pop ;
        null;
_L3:
        return;
    }

    public void setCallback(int i, Callback callback)
    {
        this;
        callback;
        i;
        JVM INSTR tableswitch 0 0: default 29
    //                   0 20;
           goto _L1 _L2
_L2:
        (MethodInterceptor);
        CGLIB$CALLBACK_0;
          goto _L3
_L1:
        JVM INSTR pop2 ;
_L3:
    }

    public Callback[] getCallbacks()
    {
        CGLIB$BIND_CALLBACKS(this);
        this;
        return (new Callback[] {
            CGLIB$CALLBACK_0
        });
    }

    public void setCallbacks(Callback acallback[])
    {
        this;
        acallback;
        JVM INSTR dup2 ;
        0;
        JVM INSTR aaload ;
        (MethodInterceptor);
        CGLIB$CALLBACK_0;
    }

    private boolean CGLIB$BOUND;
    private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
    private static final Callback CGLIB$STATIC_CALLBACKS[];
    private MethodInterceptor CGLIB$CALLBACK_0;
    private static final Method CGLIB$delete$0$Method;
    private static final MethodProxy CGLIB$delete$0$Proxy;
    private static final Object CGLIB$emptyArgs[];
    private static final Method CGLIB$create$1$Method;
    private static final MethodProxy CGLIB$create$1$Proxy;
    private static final Method CGLIB$query$2$Method;
    private static final MethodProxy CGLIB$query$2$Proxy;
    private static final Method CGLIB$update$3$Method;
    private static final MethodProxy CGLIB$update$3$Proxy;
    private static final Method CGLIB$finalize$4$Method;
    private static final MethodProxy CGLIB$finalize$4$Proxy;
    private static final Method CGLIB$hashCode$5$Method;
    private static final MethodProxy CGLIB$hashCode$5$Proxy;
    private static final Method CGLIB$clone$6$Method;
    private static final MethodProxy CGLIB$clone$6$Proxy;
    private static final Method CGLIB$equals$7$Method;
    private static final MethodProxy CGLIB$equals$7$Proxy;
    private static final Method CGLIB$toString$8$Method;
    private static final MethodProxy CGLIB$toString$8$Proxy;

    static 
    {
        CGLIB$STATICHOOK1();
    }

    public ()
    {
        CGLIB$BIND_CALLBACKS(this);    }}

相關文章
相關標籤/搜索