当类具有使用URLClassLoader java的包声明时,无法加载类(C:\com\scheduler\jobs)

当类具有使用URLClassLoader java的包声明时,无法加载类(C:\com\scheduler\jobs),java,Java,我正在尝试从当前应用程序中的文件夹(C:\com\scheduler\jobs)加载类“SampleTest.class”,当它没有包声明时,我可以加载该类 当“SampleTest.class”有包声明时,我无法加载,并且没有找到类 尝试加载类时的当前应用程序: **ReadInterfacesCount.java** URL url = new URL("file:/C:/com/scheduler/jobs/"); ClassLoader cl = new URLClassLoader

我正在尝试从当前应用程序中的文件夹(C:\com\scheduler\jobs)加载类“SampleTest.class”,当它没有包声明时,我可以加载该类

当“SampleTest.class”有包声明时,我无法加载,并且没有找到类

尝试加载类时的当前应用程序:

**ReadInterfacesCount.java**

URL url = new URL("file:/C:/com/scheduler/jobs/");
 ClassLoader cl = new URLClassLoader(new URL[]{url});
Class<?> aClass = cl.loadClass("SampleTest");
System.out.println("Interfaces count ==> "+aClass.getInterfaces().length);
公共类SampleTest实现可序列化{

 public static void main(String[] args) throws IOException{

            System.out.println("From Sample Test");
   }
}
当我运行ReadInterfacesCount时,它给出了以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: SampleTest (wrong name: com/scheduler/jobs/SampleTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.test.ReadAllJavaClasses.getListeners(ReadAllJavaClasses.java:119)
at com.test.ReadAllJavaClasses.main(ReadAllJavaClasses.java:101)
当我删除SampleTest文件中的包声明时,现在我可以加载这个类了

有人能帮我吗

谢谢,
纳雷什·卡拉马迪。

当有人对我的评论投了更高的票时,我正在将这个快速的假设转化为一个答案

Class.forName(“SampleTest”,…)
未能实例化名为
com.scheduler.jobs.SampleTest
,但成功实例化了一个类
SampleTest
,您可能需要尝试
Class.forName(“com.scheduler.jobs.SampleTest”,…)

编辑:正如我在评论中所写的那样,以这种方式消化代码对我来说似乎非常奇怪-我从未尝试过。在你的评论之后,我想到的下一件事是:当你想加载存储在
C:/com/scheduler/jobs/SampleTest.class
中的类,作为
com.scheduler.jobs.SampleTest
,你可能需要给出
C:/
作为类加载器的路径,因为这是它应该在其中搜索此包/名称的类的根


回到前面提到的代码的奇怪之处:我不相信任何明确处理类加载的业务级代码。类加载是一个基础架构问题,虽然您可以解决手头的问题,但我相信您解决的是一个完全错误的问题—您的基础架构存在严重的问题(这在这个问题上是无法解决的)

当有人对我的评论投了更高的票时,我正在将这个快速的假设转化为一个答案

Class.forName(“SampleTest”,…)
未能实例化名为
com.scheduler.jobs.SampleTest
,但成功实例化了一个类
SampleTest
,您可能需要尝试
Class.forName(“com.scheduler.jobs.SampleTest”,…)

编辑:正如我在评论中所写的那样,以这种方式消化代码对我来说似乎非常奇怪-我从未尝试过。在你的评论之后,我想到的下一件事是:当你想加载存储在
C:/com/scheduler/jobs/SampleTest.class
中的类,作为
com.scheduler.jobs.SampleTest
,你可能需要给出
C:/
作为类加载器的路径,因为这是它应该在其中搜索此包/名称的类的根


回到前面提到的代码的奇怪之处:我不相信任何明确处理类加载的业务级代码。类加载是一个基础架构问题,虽然您可以解决手头的问题,但我相信您解决的是一个完全错误的问题—您的基础架构存在严重的问题(这在这个问题上无法解决)

我从来没有想过用这种方式来消化代码,但是我想到的是
Class.forName(“SampleTest”,…)
vs
Class.forName(“com.scheduler.jobs.SampleTest”,…)
。与Liferay和Spring(你的标签)完全无关,这是。我从来没有想过用这种方式来消化代码,但我想到的是
Class.forName(“SampleTest”)
vs
Class.forName(“com.scheduler.jobs.SampleTest”),…)
与Liferay和Spring(您的标签)完全无关,这是。感谢您的快速回复Olaf Kock,我尝试了您建议的不走运的方式。我将我的代码类.forName()更改为cl.loadClass(“SampleTest”);当目标类有包声明时仍然存在同样的问题。当它没有包声明时,我可以以两种方式加载该类。感谢您的快速回复Olaf Kock,我尝试了您建议的不走运的方式。我将我的代码类.forName()更改为cl.loadClass(“SampleTest”);当目标类有包声明时仍然存在相同的问题。当它没有包声明时,我可以用两种方式加载该类。
Exception in thread "main" java.lang.NoClassDefFoundError: SampleTest (wrong name: com/scheduler/jobs/SampleTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.test.ReadAllJavaClasses.getListeners(ReadAllJavaClasses.java:119)
at com.test.ReadAllJavaClasses.main(ReadAllJavaClasses.java:101)