CGLib缺少jar出現 java.lang.ClassNotFoundException: org.objectweb.asm.Type


CGLib實現動態代理區別於JDK動態代理,不需要目標類實現任何接口,是通過生成代理類子類的方式,而且據說速度要快於JDK動態代理。所以我想要試驗一下CGlib的動態代理,網上找了些例子,自己動手寫了一個Demo,運行時拋出以下異常

這個異常說明的很清楚,因為使用了CGlib的Enhancer類,這個類用於為非接口類型創建一個Java代理,類里面使用了org.objectweb.asm.Type。ASM是一個字節碼解析的工具,導入ASM的jar即可解決該問題,PS:如果使用Maven構建項目就不會出現這個問題

在這里貼一下我寫的Deam,目標類:

public class Cat {
    
    public void say() {
        System.out.println("我是一只貓");
    }
    
}

代理類:

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CatProxy implements MethodInterceptor{
    
    //目標對象,這里使用Object
    private Object target;
    
    /**
     * 代理對象創建過程
     * @param target
     * @return
     */
    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        //public interface MethodInterceptor extends Callback 所以這里可以給this
        enhancer.setCallback(this);
        Object proxy = enhancer.create();
        return proxy;  //返回代理對象
    }

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("---------doSomething-------Start");
        Object proxy = arg1.invoke(target, arg2);
        System.out.println("---------doSomething-------End");
        return proxy;
    }
    
    public static void main(String[] args) {
        Cat cat = (Cat) new CatProxy().getInstance(new Cat());
        cat.say();
    }

}

更多關於CGLib的介紹可以參照以下博文:

https://www.cnblogs.com/mr-long/p/5889054.html

http://www.cnblogs.com/icejoywoo/archive/2011/06/05/2072970.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM