我有一个字符串变量,它保留了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();