注册 登录
编程论坛 JAVA论坛

cglib出现java.lang.NoClassDefFoundError求指教

郭俊森1234 发布于 2018-03-30 16:13, 2696 次点击
被代理的类:
public class User {
    private int age;
    private String name;
    public User() {
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int age() {
        return age;
    }
    public String name() {
        return name;
    }
    public void run() {
        System.out.println("我的run方法执行了");
    }
    public void test() {
        System.out.println("我的test方法执行了");
    }
    public String toString() {
        return name + "=" + age;
    }
}
生成被代理类的子类作为代理类:
package CGLIB;

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 MyMethodInterceptor implements MethodInterceptor{
    public Object target;
    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        Object b = arg3.invokeSuper(arg1,arg2);
        return b;
    }
}
使用:
package CGLIB;

public class Main {
    public static void main(String[] args) {
        MyMethodInterceptor mmi = new MyMethodInterceptor();
        User user = (User)mmi.getInstance(new User());
        user.run();
    }
}
错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184)
    at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
    at CGLIB.MyMethodInterceptor.getInstance(MyMethodInterceptor.java:13)
    at CGLIB.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
    at (Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 5 more

8 回复
#2
疯狂的小a2018-03-30 16:31
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
#3
郭俊森12342018-03-30 18:48
我是从官网上面下载的应该不会出现类找不到,同时这个是用于测试的,只用了一个包不会出现架包冲突,这是什么原因导致的呢
#4
疯狂的小a2018-03-30 19:04
程序代码:
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 MyMethodInterceptor implements MethodInterceptor {
    public Object target;

    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        Object b = arg1.invoke(target, arg2);
        return b;
    }
}
#5
疯狂的小a2018-03-30 19:04
回复 4楼 疯狂的小a
代理的时候,传参错了
#6
郭俊森12342018-03-30 21:17
通过尝试你那种修改方法不起作用。
#7
疯狂的小a2018-03-31 13:31
为什么我的可以....
#8
郭俊森12342018-03-31 19:27
不知道你能够将你使用的包发给我我看是不是包的原因,我qq2064253891
#9
疯狂的小a2018-04-01 08:38
程序代码:
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 MyMethodInterceptor implements MethodInterceptor {
    public Object target;

    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        Object b = arg1.invoke(target, arg2);
        return b;
    }
   
}
1