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

Posted OverZeal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于CGLib缺少jar出现 java.lang.ClassNotFoundException: org.objectweb.asm.Type的主要内容,如果未能解决你的问题,请参考以下文章

第一章--环境搭建

Spring框架_代理模式(静态代理,动态代理,cglib代理)

代理模式之 cglib

spring查看生成的cglib代理类源码详解

写cglib动态代理需要哪些jar包

在使用hibernate 和spring 构架的框架中如果出现Initialization of bean failed; nested exception is java.lang.NoSuchMe