我有一个基于Java的RMI服务器,其中一个接口方法是这样的:
public Properties process(String operation, Properties params) {
Class nodecls = Class.forName("com.example.commands." + operation);
}
此方法一直运行良好,但有时(例如,一百万次RMI调用中)会抛出ClassNotFoundException
。这可能是什么原因?我确信传递的名字是正确的。
答案 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 classnotfoundexception有一个更简单的描述:
当应用程序尝试按名称加载类时抛出的Java异常。通常由以下之一提出:
- 类Class [...]
中的forName方法当在类路径中找不到具有指定名称的类的定义时。
因此,只有两个原因:
"com.example.commands." + operation
的类。ClassLoader
的{{1}}无法找到Class
类。也许一些反思技巧打破了它。但是,您应该永远不必为此烦恼,因为您的方法甚至无法编译 - 它是非"com.example.commands." + operation
返回类型,而您从未包含正确的void
语句。 / p>