開心生活站

位置:首頁 > IT科技 > 

java,cglib

IT科技2.69W

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java cglib是什麼,讓我們一起了解一下?

CGLIB(Code Generator Library)是一個強大的、高性能的代碼生成庫,被廣泛應用於AOP框架(Spring、dynaop)中,用以提供方法攔截操作。

爲什麼要使用CGLIB?

因爲CGLIB代理主要通過對字節碼的操作,爲對象引入間接級別,以控制對象的訪問。我們知道Java中有一個動態代理也是做這個事情的,那我們爲什麼不直接使用Java動態代理,而要使用CGLIB呢?答案是CGLIB相比於JDK動態代理更加強大,JDK動態代理雖然簡單易用,但是其有一個致命缺陷是,只能對接口進行代理。如果要代理的類爲一個普通類、沒有接口,那麼Java動態代理就沒法使用了。

java cglib

java如何實現代理cglib?

Enhancer是cglib中使用頻率很高的一個類,它是一個字節碼增強器,可以用來爲無接口的類創建代理。它的功能與java自帶的Proxy類挺相似的。它會根據某個給定的類創建子類,並且所有非final的方法都帶有回調鉤子。

實戰操作如下:

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</version></dependency>

public class SampleClass {    public void test(){        System.out.println("hello world");    }     public static void main(String[] args) {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(SampleClass.class);        enhancer.setCallback(new MethodInterceptor() {            @Override            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {                System.out.println("before method run...");                Object result = proxy.invokeSuper(obj, args);                System.out.println("after method run...");                return result;            }        });        SampleClass sample = (SampleClass) enhancer.create();        sample.test();    }}

標籤:java cglib