java - 如何找到给定类名的包名?

标签 java class reflection package

给定一个字符串形式的类名,我如何在运行时获取它的包名?我没有包含包名 + 类名的完全限定名称。只是类名。

我希望在 Class.forName() 方法中使用包名。

我完全可以找到第一个匹配的包名称(如果多个包具有相同的类)。

有什么想法吗?

更新

我没有要处理的类实例。我的要求是使用 Class.forName() 方法创建一个类。但我只是将类名作为字符串。我需要一些方法来遍历包并确定我拥有的类是否属于该包。

异常的堆栈跟踪是

Exception in thread "main" java.lang.ClassNotFoundException: MyAddressBookPage
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)

最佳答案

这很可能是一种非常低效、臃肿、不方便的方式来完成你想要实现的目标,希望已经有一种开箱即用的单一方式来做到这一点......但它应该有效.

基本上,扫描类路径中的每个类,直到找到 getSimpleName() 与您的类名匹配的类。

我建议查看 Google Classpath Explorer帮助管理执行此操作的具体细节。

它可能看起来像这样:

 ClassPath classpath = new ClassPathFactory().createFromJVM();
 RegExpResourceFilter regExpResourceFilter = new RegExpResourceFilter(".*", ".*\\.class");
 String[] resources = classpath.findResources("", regExpResourceFilter);

resources 是一个字符串数组,例如“com/foo/bar/Baz.class”。您现在可以简单地遍历并找到匹配的条目,并将它们从斜线转换为点线,去掉“.class”等。尝试匹配内部类时要小心,因为它们中会有一个“$”字符。

此外,据我所知,这将不会导致加载这些类。

关于java - 如何找到给定类名的包名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8742965/

相关文章:

c++ - 将类声明为整数

java - 关于用 Java 编写自定义类异常

class - 如何从隐式 ClassTag[T] 获取 Class[T]?

c# - WCF 获取入口程序集

java - 用eclipse测试java程序的内存消耗

java - 如何编写 Gradle 脚本以将 shadowjar 发布到 Artifactory

java - 如何生成不重复的随机数

java - 页面包含带有 LayoutTransition (或 animateLayoutChanges ="true")的 ViewGroup,这会干扰滚动动画

Java新手-找不到符号-变量

javascript - 如何将 ID 元素添加到特定类行?