有没有办法通过Java中的Reflection获取InnerClasses列表?

时间:2010-05-02 02:06:25

标签: java reflection

有没有办法通过Thinking in Java知道类具有的内部类?

3 个答案:

答案 0 :(得分:6)

是的,请使用Class#getDeclaredClasses()。您只需要通过检查其修饰符来确定它是内部类还是嵌套(静态)类。假设Parent是父类,这里是一个启动示例:

for (Class<?> cls : Parent.class.getDeclaredClasses()) {
    if (!Modifier.isStatic(cls.getModifiers())) {
        // This is an inner class. Do your thing here.
    } else {
        // This is a nested class. Not sure if you're interested in this.
    }
}

注意:这不仅涵盖匿名课程,但在主题上看到your previous question,我认为您没有明确要求它们。

答案 1 :(得分:0)

不,不幸的是,出于同样的原因,你不能enumerate regular classes in a package.

内部类实际上只是运行时的普通类。编译器做了一些调整以绕过通常的访问规则,例如,内部类似乎能够访问封闭类的私有字段和方法 - 它可以这样做,因为编译器创建一个非私有访问器函数,由内部阶级使用。有关详细信息,请参阅Java in a Nutshell - how inner classes work

内部类是常规类,这些类不能被可靠地枚举,所以一般的答案是否定的,不可能。

但是,它可以在特定情况下解决。如果您知道正在使用的JAR,那么您可以遍历JAR中的所有文件,查找模式yourpakage.YourClass$<something>.class的文件,其中<something>是一个或多个字符。

修改 内部类有各种类型:

  1. 声明的成员,例如接口和类
  2. 匿名课程和本地课程
  3. 如果您只关心第一个案例,那么BalusC使用getDeclaredClasses的答案是正确的。如果你想要所有内部类,那么遗憾的是getDeclaredClasses将不起作用。见SDN Bug 4191731。在这种情况下,您可以尝试链接中提出的一种类枚举方法(例如扫描JAR文件。)

答案 2 :(得分:0)

是的,有一个技巧可以做到这一点。查看有关locating resources的旧帖子。知道你的类(让我们说com.domain.api.ClassA),提取包名,将包转换为路径(用'/'替换'。'并获得com / domain / api)扫描所有文件在该文件夹中扩展.class并仅保留以您的类名开头的那些文件(ClassA $ xxxxx),这些是类ClassA的内部类