作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试一个从另一个类访问私有(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/
我是一名优秀的程序员,十分优秀!