当类存在时 CGLIB ClassNotFoundException

问题描述 投票:0回答:1

我正在使用 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

该类显然存在,那么为什么会发生这种情况?

java java-8 classnotfoundexception cglib bytecode-manipulation
1个回答
0
投票

ClassNotFoundException: 这是一个异常,当 Java 机器在 Run-time 期间动态尝试从

CLASSPATH
路径加载所需的类但找不到它时抛出。 (JVM内部原理图)

因此在运行时找不到类

net.sf.cglib.proxy.Factory
,即使它在编译期间似乎存在。

1- 确保所需的 CGLIB 库包含在项目的依赖项中。您可能需要显式地将 CGLIB 库添加到您的

classpath
以避免运行时类加载问题。

2- 检查正在使用的 CGLIB 版本,以确保与您的项目兼容。版本不匹配也会导致类加载问题。

© www.soinside.com 2019 - 2024. All rights reserved.