【发布时间】:2020-01-14 16:04:02
【问题描述】:
我在我的项目中使用了一个我无法控制的外部库。我正在使用罐子。这个外部库有一个类,我在其上调用静态方法,该方法与某些外部系统建立连接。
如果在连接到外部系统时出现问题,这个外部库类会抛出 java.lang.exception。
虽然我知道使用 Throwable 捕获异常是一种不好的做法,但我使用 Throwable 并捕获了异常,因为我想继续尝试连接外部应用程序,所以我需要继续调用这个外部类方法。
但是,当它第一次失败时,Java 在内部卸载了这个类。因为当我再次调用该方法时 java.lang.NoClassDefFoundError: Could not initialize class.
我需要知道是否有任何方法可以再次加载该类。
我尝试使用 java.lang.ClassLoader 加载类。然而这并没有奏效。
我使用下面的文章再次加载类 http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html
{
ExternalClass.connect();
}catch(Throwable t)
{
if(t instanceof java.lang.InternalError)
{
logger.error("Error While connecting", t);
}
else{
logger.error("Other Error While connecting", t);
}
}
【问题讨论】:
-
Java 没有卸载您的类,如果在您尝试重新初始化它时初始化失败,它只会抛出
NoClassDefFoundError。据我记得,该类仍然链接在类加载器中。 -
我实际上反编译了该类,如果该类有时由于网络而无法连接到设备,则连接断开它会捕获连接异常,但是它会通过扭曲显式抛出 java.lang.InternalError连接异常。如果我再次尝试在循环中调用相同的代码来建立连接,我会得到 java.lang.NoClassDefFoundError:
-
很明显,您使用的库并没有为您提供通知连接失败和重试机制的友好方式。如果您可以分享有关您如何进行连接的图书馆/课程详细信息,这可能有助于邀请替代解决方案。
-
“我用下面的文章再次加载了类……”——那么现在一切都好吗?
-
不,那没用
标签: java classloader noclassdeffounderror