【问题标题】:Load The Class manually In Java when It has failed during the static block在静态块期间失败时在 Java 中手动加载类
【发布时间】: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


【解决方案1】:

java.lang.InternalError 在 JVM 中发生意外的、无法解释的情况时抛出。 您的重点应该是找出连接失败的原因。您是否以正确的方式使用课程?

静态方法调用在第二次调用时失败的事实表明该类没有以 wight 方式消耗。在调用静态方法之前是否需要设置一些其他变量等?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2016-10-03
    • 2012-09-12
    • 2010-11-05
    相关资源
    最近更新 更多