在Java中获取类的完整路径

时间:2015-07-10 13:35:43

标签: java class reflection path

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

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

但是,这会抛出一个ClassNotFoundException,因为我的Dog在一个包中,我想Class.forName需要全名(my.project.the.package.path.Dog)。有没有办法获得完整的包名称,所以我可以将它传递给Class.forName()?

谢谢!

4 个答案:

答案 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();