Java中通过反射访问私有继承字段
我找到了一种通过 class.getDeclaredFields(); 获取继承成员的方法; 并通过 class.getFields() 访问私有成员 但我正在寻找私人继承领域。 我怎样才能做到这一点?
I found a way to get inherited members via class.getDeclaredFields();
and acces to private members via class.getFields()
But i'm looking for private inherited fields.
How can i achieve this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这应该演示如何解决它:(
或
Class.getDeclaredFields
用于所有字段的数组。)输出:
This should demonstrate how to solve it:
(Or
Class.getDeclaredFields
for an array of all fields.)Output:
这里最好的方法是使用 访问者模式 查找类和所有超类中的所有字段,并且对它们执行回调操作。
Spring有一个很好的实用
程序类
ReflectionUtils
就是这样做的:它定义了一个方法,通过回调循环遍历所有超类的所有字段:ReflectionUtils.doWithFields()
文档:
示例代码:
输出:
The best approach here is using the Visitor Pattern do find all fields in the class and all super classes and execute a callback action on them.
Implementation
Spring has a nice Utility class
ReflectionUtils
that does just that: it defines a method to loop over all fields of all super classes with a callback:ReflectionUtils.doWithFields()
Documentation:
Sample code:
Output:
这样就可以了:
如果您使用像 EclEmma 这样的代码覆盖工具,您必须注意:它们添加了每个班级的隐藏字段。对于 EclEmma,这些字段被标记为合成,您可以像这样过滤掉它们:
This'll do it:
If you use a code coverage tool like EclEmma, you have to watch out: they add a hidden field to each of your classes. In the case of EclEmma, these fields are marked synthetic, and you can filter them out like this:
(基于这个答案)
(based on this answer)
事实上,我使用复杂的类型层次结构,因此您的解决方案并不完整。
我需要进行递归调用来获取所有私有继承字段。
这是我的解决方案
In fact i use a complex type hierachy so you solution is not complete.
I need to make a recursive call to get all the private inherited fields.
Here is my solution
我需要在 Model Citizen 中添加对蓝图继承字段的支持。我派生了这个方法,它对于检索类的字段+继承字段来说更加简洁。
I needed to add support for inherited fields for blueprints in Model Citizen. I derived this method that is a bit more concise for retrieving a Class' fields + inherited fields.
Commons Lang 有 util 方法
FieldUtils#getAllFieldsList
为此。Commons Lang has the util method
FieldUtils#getAllFieldsList
for this.