【问题标题】:ClassNotFoundException while using Class.forname使用 Class.forname 时出现 ClassNotFoundException
【发布时间】:2013-03-04 12:32:30
【问题描述】:

我正在编写一个通用解释器。它包含原始过程(例如方法调用、方法返回、控制语句等),这些过程由读取源代码、以任何语言编写并激活原始代码的翻译器运行。这个翻译器的核心是由一个字符串数组构成的,该数组包含实现方法的过程和动态激活的方法的名称。

以下代码用于调用索引procIndex所指向的方法。它基于我找到的一个示例,与其他示例相同:

try {
    Class<?> c = Class.forName("FinalTestDecoder");
    Method  commandExe = 
         c.getDeclaredMethod (commandsTable[commandIndex][methodName], (Class<?>[])null);
    commandExe.invoke (commandExe, (Object []) null);
} catch (IllegalAccessException| IllegalArgumentException| 
       InvocationTargetException| EmptyStackException | 
        ClassNotFoundException | NoSuchMethodException | SecurityException  e) { 
  handleErr(cmdMethodNotFound, "Command: "+ commandsTable[commandIndex][programCommand]); 
} finally {
   found = true; 
}   // Cause the loop to terminate

handleErr 方法正在处理错误条件并获取十进制错误代码和字符串。任何异常都可以调用错误处理程序。

问题出在Class&lt;?&gt; c = Class.forName("FinalTestDecoder"); 行中,该行引发了ClassNotFoundException。为了克服这个问题,我做了两个实验:最初,被调用的方法与调用代码在同一个类中;第二次我创建了一个包含调用方法的嵌入类。结果是一样的。

嗯,我在这个问题上花了几个小时,但没有什么想法。任何帮助都将受到欢迎

【问题讨论】:

  • 您是否为 FinalTestDecoder 使用完全限定的类名?

标签: java arrays class methods


【解决方案1】:

您必须使用方法forName 所需的全限定类名。像这样的东西:-

Class.forName("com.test.class.file.diretory.FinalTestDecoder");

【讨论】:

  • 尊敬的 RJ,非常感谢您 - 这确实解决了该行的问题。但是,它把我带到了声明方法的下一行。此行调用 NoSuchMethodException。我尝试在之前添加类名(当然,这无关紧要)并将向量引用替换为方法名。没有。你能再帮忙吗?
  • 亲爱的 AmitG 和 RJ,感谢您的回答。这确实解决了该行的问题。但是,我现在遇到了下一行的问题,它通过名称声明方法,并生成 NoSuchMethodException。我用方法名称替换了数组引用,没有任何变化。你能再叫我一次吗?
  • 因此,您正在寻找的方法是为相关类继承或声明的。 getDeclaredMethod 不会返回继承的方法。
  • 方法在这个类中声明,不被继承
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
相关资源
最近更新 更多