仅通过简单名称反思地找到一个类

我想知道是否有任何给定的函数允许我内省一个类而不必编写包含类的包。

例如,我想看一下Integer类的方法和超类,为了做到这一点,我必须指定类所在的包。 这将是“java.lang.Integer”

而不是这样做,我只想输入类名,以便显示类的信息。 就像这个“整数”

我怎么能让我的程序只检查类名,无论它位于何处?

Java不会阻止您创建自己的my.company.Integer类和my.other.company.Integer类,因此它无法知道哪个Integer类是正确的类。

关于我可以建议的答案的关闭事项是创建一个预定义的包列表,您要在其中搜索类,并继续尝试每个包直到找到您的类。

所以类似于:

 class ClassFinder{ public static final String[] searchPackages = { "java.lang", "java.util", "my.company", "my.company.other" }; public Class findClassByName(String name) { for(int i=0; i 

如果您想获得所有可用软件包的列表而不是硬编码, 请参阅此处 。

请注意,此方法不太可能表现良好,因此请谨慎使用。

借用的代码,略有修改(……来自@ rodion的回答)

 /** * Returns first loaded Class found in the searchPackages * @param classname the simple class name (eg "String") * @param searchPackages String[] of packages to search. * 
  • Place the more important packages at the top since the first Class * found is returned
  • *
    //Example * public static final String[] searchPackages = { * "java.lang", * "java.util", * "my.company", * "my.company.other" }; * * @return the loaded Class or null if not found */ public static final Class findClassByName(String classname, String[] searchPackages) { for(int i=0; i

    修改相同的代码,以便在找到重复的类名时抛出exception

     /** * Returns the loaded Class found in the searchPackages * @param classname the simple class name (eg "String") * @param searchPackages String[] of packages to search. * 
  • Place the more important packages at the top since the first Class * found is returned
  • *
    //Example * public static final String[] searchPackages = { * "java.lang", * "java.util", * "my.company", * "my.company.other" }; * * @throws RuntimeException if more than one class of the same classname found in multiple packages * @return the loaded Class (guaranteed to be unique among the searchPackages) or null if not found */ public static final Class findClassByNameNoDupes(String classname, String[] searchPackages) { Class foundClass = null; for(int i=0; i

    这是不可能的,类被引用后动态加载。 因此,没有办法深入挖掘可用包的列表,因为没有这样的东西。

    但是,有一些方法可以检查jar子,因为这些是zip文件(包括标准的JVMjar子)。