我编写了一些代码来分析与Java 1.6 API捆绑在一起的所有软件包/类。这意味着遍历所有与它们一起进行反射操作的类以生成统计信息。

这些代码实际上都不会创建任何类实例或从类中调用任何方法:我只是在做诸如调用getDeclaredMethods()getDeclaredFields()的工作。

对于大多数类(这在java.*javax.*包中几乎所有内容)来说,这都很好。但是,其他一些类破坏了我的程序,并抛出如下异常:

WARNING: "IOP00710208: (INTERNAL) Unable to determine local hostname from InetAddress.getLocalHost().getHostName()"
org.omg.CORBA.INTERNAL:   vmcid: SUN  minor code: 208  completed: No

这似乎是一个奇怪的问题。
难道是,当我引用该类时(例如,通过调用Class.forName()),它会在该类中调用静态构造函数?就像是工厂类,还是已经实例化了final字段?

通过将所有内容放在try/catch(Throwable)块中,我解决了类在查看它们时引发异常的问题。

我很好奇是什么导致了这些异常。就像我想的那样,是静态构造函数吗?我找不到这些 class 的来源(也许我只是在错误的地方寻找!!),所以我无法检查自己……

最佳答案

是的,导致加载类(例如,通过class.forName())可以导致运行静态初始化程序。在下面的示例中,加载此类将输出“Hello”:

public class Demo{
  static{
    System.out.println("Hello");
  }
}

09-09 23:45
查看更多