gpt4 book ai didi

java.lang.ClassNotFoundException : A 异常

转载 作者:行者123 更新时间:2023-11-29 10:15:44 25 4
gpt4 key购买 nike

我正在测试一个从另一个类访问私有(private)方法的例子并得到一个异常

public class WithoutMain 
{
public static void main(String args[]) throws Exception
{
Class c = Class.forName("A");
Object o = c.newInstance();
Method m = c.getDeclaredMethod("message", null);
m.setAccessible(true);
m.invoke(o, null);
}
}

public class A {

private void message(){
System.out.println("This is a private method.");
}
}

获取以下异常

Exception in thread "main" java.lang.ClassNotFoundException: A
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)

这两个类位于同一个包中。谁能告诉我为什么会出现这个异常?

最佳答案

您需要使用类的完全限定名称来使用 Class.forName() 加载它

现在您可能会争辩为什么?就像你的情况一样,这两个类都在同一个目录/包中。

我会反驳,Java 中没有定义类加载器首先在同一目录中查找的规则。

如果您想了解类加载的工作原理,我建议您查看该类的源代码 java.lang.ClassLoader

所以当你调用 Class.forName它使用委托(delegate),并且分配了加载此类作业的类加载器将不知道当前包或任何位置。因此,它需要完全限定的类名。

还有一个提示,在 java 中,加载类的完全限定类名是 <ClassLoader><packageName><className> .这就是 JVM 中类的唯一标识方式。

希望对你有帮助

编辑

您的代码只能在一种情况下工作,即如果这两个类都在默认包中。

关于java.lang.ClassNotFoundException : A 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18551669/

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