为什么不能加载内部类? ClassNotFoundException的

时间:2014-01-27 19:58:07

标签: java classloader classnotfoundexception

为什么以下代码会导致ClassNotFoundException

public class App02 {

    public static class A {
    }

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

        try {
            System.out.println("A.class.getCanonicalName() = " + A.class.getCanonicalName());
            Class c = Class.forName("tests.App02.A"); //error on this line
            System.out.println(c.getName());
        }

        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

A.class.getCanonicalName() = tests.App02.A
java.lang.ClassNotFoundException: tests.App02.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)
    at java.lang.Class.forName(Class.java:190)
    at tests.App02.main(App02.java:15)

3 个答案:

答案 0 :(得分:15)

试试Class c = Class.forName("tests.App02$A")。它不是顶级类,所以使用$来定位它。

答案 1 :(得分:6)

您需要使用$来访问嵌套类

Class c = Class.forName("tests.App02$A");

编译类时,您会注意到嵌套类在包App02$A.class下命名为:tests。那会更有意义。

答案 2 :(得分:3)

因为您使用的是规范名称,但您应该使用名称A.class.getName())。

在您的情况下,您应该使用Class c = Class.forName("tests.App02$A");