Class.forName(“FQN”)间歇性地抛出ClassNotFoundException

时间:2014-11-17 11:10:53

标签: java classloader rmi classnotfoundexception

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

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

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

1 个答案:

答案 0 :(得分:3)

来自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异常。通常由以下之一提出:

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

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

因此,只有两个原因:

  1. 类路径中不存在名为"com.example.commands." + operation的类。
  2. 您的方法所在的ClassLoader的{​​{1}}无法找到Class类。也许一些反思技巧打破了它。
  3. 但是,您应该永远不必为此烦恼,因为您的方法甚至无法编译 - 它是非"com.example.commands." + operation返回类型,而您从未包含正确的void语句。 / p>