gpt4 book ai didi

java - 无法加载类(C :\com\scheduler\jobs) when class has package declaration using URLClassLoader java

转载 作者:行者123 更新时间:2023-12-02 02:55:10 25 4
gpt4 key购买 nike

我正在尝试从当前应用程序中的文件夹(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.class

package com.scheduler.jobs;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;

公共(public)类 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:/ 作为类加载器的路径,因为这是它应该搜索此包/名称的类的根目录。

回到前面提到的代码怪异之处:我不信任任何显式处理类加载的业务级代码。类加载是一个基础设施问题,虽然您可能会解决手头的问题,但我相信您正在解决一个完全错误的问题 - 您的底层架构可能存在严重问题(在这个问题中无法解决)

关于java - 无法加载类(C :\com\scheduler\jobs) when class has package declaration using URLClassLoader java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43207030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com