我有一个String变量,它保留了Java Class的名称(让我们称之为Dog),我使用这样的字符串:
String myString = className;
Class<?> klass = Class.forName(myString);
但是,这会抛出一个ClassNotFoundException,因为我的Dog在一个包中,我想Class.forName需要全名(my.project.the.package.path.Dog)。有没有办法获得完整的包名称,所以我可以将它传递给Class.forName()?
谢谢!
答案 0 :(得分:1)
如果你只有Dog
,那么JVM就不可能知道哪个类是什么意思。考虑一下。
package com.example.foo;
class Dog {
}
和
package com.example.bar;
class Dog {
}
JVM如何知道com.example.foo.Dog
是指com.example.bar.Dog
还是Dog
? 包括的全名是必要的。
答案 1 :(得分:0)
您不能这样做,因为在各种包中可能有多个Dog类。
但是您可以使用this问题
的答案之一中给出的方法迭代所有已加载的类请参阅eis的回答。您可以使用此代码列出已加载的所有类,并找到被称为#34; Dog&#34;的一个或多个类。
但是,你可能不应该这样做。无论你从哪里得到这个字符串 - 要么你应该有默认的包名,要么传递完整的类名。
答案 2 :(得分:0)
使用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();
}
答案 3 :(得分:-1)
您创建Dog.class而不是对象。如果你想获得课程信息,那么你必须在课程中输入完整的课程名称。
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();