我正在使用 CGLIB 生成一个扩展私有类的类。但是,当我调用
Enhancer#create(Class[], Object[])
时,我收到了 net.sf.cglib.proxy.Factory
的 ClassNotFoundException。
我在调用create函数之前添加了一个检查以确认该类存在:
System.out.println("Loaded Factory: "
+ (ProxyTest.class.getClassLoader().loadClass("net.sf.cglib.proxy.Factory") != null));
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Class.forName("com.whatever.SomePrivateClass"));
// ...
Object isntance = enhancer.create(new Class[] { /*...*/ }, new Object[] { /*...*/ });
这是输出:
Loaded Factory: true
Exception in thread "main" net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:348)
at net.sf.cglib.proxy.Enhancer.generate(Enhancer.java:492)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:96)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:94)
at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:119)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:294)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:324)
at com.cardinal.ProxyTest.main(ProxyTest.java:33)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:459)
at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:339)
... 12 more
Caused by: java.lang.NoClassDefFoundError: net/sf/cglib/proxy/Factory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
... 18 more
Caused by: java.lang.ClassNotFoundException: net.sf.cglib.proxy.Factory
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 20 more
该类显然存在,那么为什么会发生这种情况?
ClassNotFoundException: 这是一个异常,当 Java 机器在 Run-time 期间动态尝试从
CLASSPATH
路径加载所需的类但找不到它时抛出。 (JVM内部原理图)
因此在运行时找不到类
net.sf.cglib.proxy.Factory
,即使它在编译期间似乎存在。
1- 确保所需的 CGLIB 库包含在项目的依赖项中。您可能需要显式地将 CGLIB 库添加到您的
classpath
以避免运行时类加载问题。
2- 检查正在使用的 CGLIB 版本,以确保与您的项目兼容。版本不匹配也会导致类加载问题。