获取Java中类的完整路径



我有一个字符串变量,它保留了Java类的名称(我们称它为Dog)我像这样使用这个字符串:

String myString = className; Class<?> klass = Class.forName(myString);

然而,这会抛出一个ClassNotFoundException,因为我的Dog在一个包中,我想是Class。forName需要全名(my.project.the.package.path.Dog)。是否有一种方法可以获得完整的包名称,以便我可以将其传递给Class.forName()?

谢谢!

如果只有Dog, JVM就不可能知道哪个类是mean。考虑这个。

package com.example.foo;
class Dog {
}

package com.example.bar;
class Dog {
}

JVM如何知道Dog是指com.example.foo.Dog还是com.example.bar.Dog ?全名包括包是必要的。

您不能这样做,因为在不同的包中可能有多个Dog类。

但是你可以使用这个问题的答案之一给出的方法迭代所有加载的类

见答案。您可以使用此代码列出已加载的所有类,并找到一个或多个称为"Dog"的类。

但是,您可能不应该这样做。无论你从哪里得到这个字符串——要么你应该有默认的包名,要么传递完整的类名。

使用class.getCanonicalName()存储类名和路径,然后使用Class.forName访问

String classPath = Dog.class.getCanonicalName();
System.out.println("Store class path:" + classPath);
try {
    Class<?> klass = Class.forName(classPath);
    Dog objDog = (Dog) klass.newInstance();
    System.out.println(objDog);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

您正在创建Dog.class而不是object。如果你想获得类信息,那么你必须把完整的类名放在package中。

System.out.println( Dog.class.getName() );
Class< ? > c = Class.forName( Dog.class.getName() );
/// Class< ? > c = Class.forName( "com.some.package.Dog" );
Dog t = (Dog) c.newInstance();

相关内容

  • 没有找到相关文章

最新更新