给定一个字符串形式的类名,我如何在运行时获取它的包名?我没有包含包名 + 类名的完全限定名称。只是类名。
我希望在 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/