2010-05-02 85 views

回答

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,我不认为你明确要求他们。

0

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

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

内部类是普通班,而这些不能可靠列举,所以一般的答案是否定的,不可能的。

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

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

  1. 声明成员,如接口和类
  2. 匿名类和局部类

如果你只在乎第一种情况,那么BalusC使用getDeclaredClasses的答案是正确的。如果你想全部内部类,然后getDeclaredClasses不幸的是不会工作。请参阅SDN Bug 4191731。在这种情况下,你可以尝试在链接提出的类enumeation方法之一(如扫描JAR文件)。

+0

我想你混淆与“匿名类”的内部类。 – BalusC 2010-05-02 02:16:09

+0

@BalusC好吧,技术上匿名的类是内部类。 :) – cletus 2010-05-02 02:20:34

0

是的,还有一招做到这一点。查看关于locating resources的旧帖子。了解你的类(比方说com.domain.api.ClassA),解压包名,包转换为路径(替换“”与‘/’,你会得到COM /域/ API)扫描所有文件该文件夹中扩展的.class,只保留那些与你的类名(ClassA的$ XXXXX)开始的文件,这些都是类ClassA的

相关问题