<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?
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(); }}