【问题标题】:Getting ClassNotFoundException while using Class.forName("com.actitime5.Testcases."+vriable);使用 Class.forName("com.actitime5.Testcases."+vriable); 时获取 ClassNotFoundException
【发布时间】:2014-11-03 19:15:43
【问题描述】:

我最近一直在搞乱 Java 中的 ClassLoaders,试图运行我的自动化脚本代码,该代码使用动态加载类并获取 ClassNotFoundException

##MyCode

package com.actitime5.frameworkengine;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import com.gmail5.Testcases.LoginLogout;

import org.junit.runner.JUnitCore;
public class Init {

public static void main(String args[]) throws Exception
{
Init in=new Init();
String url=in.getConfigValue("url");
ExcelLibrary lib=new ExcelLibrary();
JUnitCore core = new JUnitCore();
int numberofTestcases=lib.getRowCont("Scenario");
System.out.println(numberofTestcases);
for(int i=1;i<=numberofTestcases;i++)
{String status=lib.getExcelData("Scenario", i, 1);
if(status.equals("yes"))
{String scriptnam=lib.getExcelData("Scenario", i, 0);
System.out.println("Sheet Name"+" "+scriptnam);
Class scriptToRun= Class.forName("com.gmail5.Testcases."+scriptnam);

core.run(scriptToRun);
}

}}

##Errors that i am getting :

1
Sheet Name LoginLogout   
Exception in thread "main" java.lang.ClassNotFoundException:com.gmail5.Testcases.LoginLogout   
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.gmail5.frameworkengine.Init.main(Init.java:24)

我尝试加载的类在包中可用:com.gmail5.Testcases.*;,但它仍然抛出异常

【问题讨论】:

  • 你能发布LoginLogout的完整代码吗?同时编辑你的问题,向我们展示你是如何运行这个东西的
  • 添加代码以打印出您传递给forName 的全名,这样您就可以仔细检查它是否正确。并临时将最后两行替换为core.run(com.gmail5.Testcases.MyMissingClass.class);,以确保其有效。 (如果不是,MyMissingClass 在目录结构中的位置不正确。)

标签: java class classloader


【解决方案1】:

我认为您的班级名称有尾随空格。在尝试加载类之前尝试trim()ming 关闭它。

您可以通过替换来确认这一点

System.out.println("Sheet Name"+" "+scriptnam);

System.out.println("Sheet Name"+" '"+scriptnam+"'");

我希望这会打印出如下内容:

Sheet Name 'LoginLogout    '

当我单击“编辑”来编辑您的问题时,我可以看到堆栈跟踪和您的 Sheet Name 消息中的类名后面有尾随空格。 (我没有更改您问题中的任何内容:我只是使用“编辑”功能查看了您问题的原始文本,然后单击“取消”。)

【讨论】:

  • 谢谢卢克,你是对的,有一个空格,我是从 xlsx 表中获取这个类名的,类名后面有一个空格。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
相关资源
最近更新 更多