有没有一种方法可以通过Java中的反射来获取内部类的列表?

有没有一种方法可以通过Java中的反射来获取内部类的列表?,java,reflection,Java,Reflection,有没有一种方法可以通过Java中的反射来了解类的内部类?是的,用于此。您只需要通过检查其修饰符来确定它是内部类还是嵌套(静态)类。假设Parent是父类,下面是一个启动示例: for (Class<?> cls : Parent.class.getDeclaredClasses()) { if (!Modifier.isStatic(cls.getModifiers())) { // This is an inner class. Do your thing

有没有一种方法可以通过Java中的反射来了解类的内部类?

是的,用于此。您只需要通过检查其修饰符来确定它是内部类还是嵌套(静态)类。假设
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.
    }
}
for(类cls:Parent.Class.getDeclaredClasses()){
如果(!Modifier.isStatic(cls.getModifiers())){
//这是一个内部类。在这里做你的事情。
}否则{
//这是一个嵌套类。不确定您是否对此感兴趣。
}
}

注意:这不包括匿名类,但在这个主题上,我认为您并没有明确要求匿名类。

不,不幸的是,出于同样的原因,您不能

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

内部类是正则类,并且这些类不能可靠地枚举,所以一般的答案是不可能的

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

编辑: 有各种类型的内部类:

  • 声明的成员,例如接口和类
  • 匿名类和本地类

  • 如果您只关心第一个案例,那么BalusC使用
    getDeclaredClasses
    的回答是正确的。如果需要所有内部类,那么不幸的是,
    getDeclaredClasses
    将无法工作。看见在这种情况下,您可以尝试链接中建议的类枚举方法之一(例如扫描JAR文件)。

    是的,有一个技巧可以做到这一点。看到一篇关于我的旧帖子。了解您的类(比如com.domain.api.ClassA),提取包名,将包转换为路径(将“.”替换为“/”,然后获得com/domain/api)扫描该文件夹中所有扩展名为.class的文件,并仅保留以您的类名(ClassA$xxxxx)开头的文件,这些是ClassA的内部类

    我想你把它们和“匿名类”混淆了。@BalusC从技术上讲,匿名类是内部类。:)