有没有办法通过Java中的Reflection来了解Class的内部类?有没有办法通过Java中的反射来获取InnerClasses的列表?
回答
是的,请使用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,我不认为你明确要求他们。
不,不幸的是,出于同样的原因,为什么你不能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。在这种情况下,你可以尝试在链接提出的类enumeation方法之一(如扫描JAR文件)。
是的,还有一招做到这一点。查看关于locating resources的旧帖子。了解你的类(比方说com.domain.api.ClassA),解压包名,包转换为路径(替换“”与‘/’,你会得到COM /域/ API)扫描所有文件该文件夹中扩展的.class,只保留那些与你的类名(ClassA的$ XXXXX)开始的文件,这些都是类ClassA的
- 1. 有没有办法通过反射来获取类型的别名?
- 2. 有没有办法获取API来反应js中的表?
- 3. 有没有办法通过值列表来过滤Salesforce报表?
- 4. 有没有办法通过属性来获取元素?
- 5. 有没有办法通过反射或其他方式来获取实体ID字段的名称?
- 6. 有没有办法通过Flickr.Net中的photoId获取照片?
- 7. 使用反射来获取所有属性并通过方法
- 8. 有没有办法通过编程从TortoiseSVN中获取项目列表?
- 9. 有没有办法通过在Python中搜索它的位置来获取列表中的项目
- 10. 使用反射,有没有办法获得超类的字段?
- 11. 有没有办法通过使用httpwebrequest的ID获取元素?
- 12. 有没有办法通过“谓词”列表来排序字符串列表?
- 13. 有没有办法通过pika列出rabbitmq中的队列?
- 14. 有没有办法反编译java类
- 15. 有没有办法通过反射知道一个方法来自调用者的程序集?
- 16. 有没有办法通过gen_tcp获取ether/ip头?
- 17. 有没有办法在sql中获取父表的父表?
- 18. 有没有一种方法来通过python反序列化java对象
- 19. 有没有办法“通过列表管道”?
- 20. 有没有办法通过输入提示制作Python列表?
- 21. 有没有办法通过box2d来实现引力的变化?
- 22. 有没有办法通过QueryDSL中的Predicate API急于获取惰性关系?
- 23. 有没有办法在SQLite中获取表的约束?
- 24. 有没有办法执行面向Clojure的反射?
- 25. 有没有办法通过WatchKit访问触觉反馈?
- 26. 在没有反射的java中xpath
- 27. 有没有办法通过响应
- 28. 有没有办法通过PHP
- 29. 有没有办法通过硒IDE
- 30. 有没有办法用反射“覆盖”一个方法?
我想你混淆与“匿名类”的内部类。 – BalusC 2010-05-02 02:16:09
@BalusC好吧,技术上匿名的类是内部类。 :) – cletus 2010-05-02 02:20:34