Context:
我正在尝试学习/练习 TDD,并决定我需要创建一个不可变的类。
为了测试“不变性不变量”(你能这么说吗?)我想我只需通过反射调用类中的所有公共方法,然后检查类之后是否没有更改。这样我以后就不太可能不小心破坏这个不变量了。这本身可能实用/有效,也可能不实用,但我认为这对我来说也是一次反思的练习。
策略:
Using getMethods()
,我只获得公共接口,但这当然也包括所有继承的方法。
那么问题是 wait() 和 notify() 等方法会导致 InitationTargetExceptions 因为我没有同步等......
- Use
getDeclaredMethods()
:
(天真地?)假设只有我声明的方法能够破坏类的不变性,我尝试使用getDeclaredMethods()
反而。
不幸的是,这会调用类中声明的所有方法(私有和公共),但不会调用超类。私有方法显然不相关,因为它们可以破坏不变性。
问题:
所以我的问题是,我怎样才能知道一个方法是否通过getDeclaredMethods()
是否公开,以便我可以通过反射调用它?浏览文档时,我什么也没发现......
我可以看到解决这个问题的其他方法,例如专门忽略 wait() 等方法,但这似乎比我能处理的更黑客。
As 评论中提到 https://stackoverflow.com/questions/23787260/how-can-i-find-out-what-a-methods-visibility-is-via-reflection#comment36584049_23787260, 您可以使用Method.getModifiers() http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#getModifiers%28%29确定与该方法关联的修饰符。
E.g.
if (Modifier.isPublic(someMethod.getModifiers()) {
// etc.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)