【发布时间】:2011-02-14 16:26:00
【问题描述】:
有没有办法通过 Java 中的 Reflection 来了解 Class 所具有的内部类?
【问题讨论】:
标签: java reflection
有没有办法通过 Java 中的 Reflection 来了解 Class 所具有的内部类?
【问题讨论】:
标签: java reflection
不,不幸的是,出于同样的原因你不能enumerate regular classes in a package.
内部类实际上只是运行时的普通类。编译器做了一些调整来绕过通常的访问规则,例如,内部类似乎能够访问封闭类的私有字段和方法 - 它可以这样做,因为编译器创建了一个非私有访问器函数内部类使用。详情请见Java in a Nutshell - how inner classes work。
内部类是常规类,无法可靠枚举,因此一般答案是否定的,不可能。
但是,可以在特定情况下解决。如果您知道您正在使用的 JAR,那么您可以遍历 JAR 中的所有文件,查找模式为 yourpakage.YourClass$<something>.class 的文件,其中 <something> 是一个或多个字符。
编辑: 内部类有多种类型:
如果您只关心第一种情况,那么 BalusC 使用 getDeclaredClasses 的答案是正确的。如果您想要 所有 内部类,那么很遗憾,getDeclaredClasses 将无法工作。见SDN Bug 4191731。在这种情况下,您可以尝试链接中提出的类枚举方法之一(例如扫描 JAR 文件。)
【讨论】:
是的,有一个技巧可以做到这一点。请参阅有关 locating resources 的旧帖子。知道你的类(比如 com.domain.api.ClassA),提取包名,将包转换为路径(用 '/' 替换 '.' 并得到 com/domain/api)扫描所有文件在该文件夹中扩展 .class 并仅保留以您的类名(ClassA$xxxxx)开头的那些文件,这些是 ClassA 类的内部类
【讨论】:
是的,为此使用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 的主题,我认为您并没有明确要求它们。
【讨论】: