【问题标题】:Class.forName("FQN") throws ClassNotFoundException IntermittentlyClass.forName("FQN") 间歇性抛出 ClassNotFoundException
【发布时间】:2015-01-14 06:55:02
【问题描述】:

我有一个基于 Java 的 RMI 服务器,其中一个接口方法是这样的:

public Properties process(String operation, Properties params) {
         Class nodecls = Class.forName("com.example.commands." + operation);
   } 

此方法一直运行良好,但有时(比如一百万次 RMI 调用)会抛出 ClassNotFoundException。这可能是什么原因?我确定传递的名称是正确的。

【问题讨论】:

标签: java classloader rmi classnotfoundexception


【解决方案1】:

来自XYZWS - What does Class forname method do?:

对Class.forName("X") 的调用会导致名为X 的类被动态加载(在运行时)。调用 forName("X") 会导致初始化名为 X 的类(即,JVM 在类加载后执行其所有静态块)。 Class.forName("X") 返回与“X”类关联的 Class 对象。返回的Class 对象不是“x”类本身的实例。

Class.forName("X") 会加载尚未加载的类。 JVM 会跟踪之前已加载的所有类。 此方法使用调用它的类的classloader。“X”是所需类的完全限定名。

The tag wiki for有更简单的描述:

当应用程序尝试按名称加载类时引发的 Java 异常。通常由以下人员之一提出:

  • 类[...]中的forName方法

当在类路径中找不到具有指定名称的类的定义时。

因此,只能有两个原因:

  1. 类路径中不存在名为 "com.example.commands." + operation 的类。
  2. 您的方法所在的Class 的ClassLoader 找不到"com.example.commands." + operation 类。也许一些反射技巧打破了它。

但是,您永远不必为此烦恼,因为您的方法甚至无法编译 - 它是非 void 返回类型,而您从未包含正确的 return 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2014-03-12
    • 2011-12-18
    相关资源
    最近更新 更多