如何通过反射找出方法的可见性?

2024-02-10

Context:

我正在尝试学习/练习 TDD,并决定我需要创建一个不可变的类。

为了测试“不变性不变量”(你能这么说吗?)我想我只需通过反射调用类中的所有公共方法,然后检查类之后是否没有更改。这样我以后就不太可能不小心破坏这个不变量了。这本身可能实用/有效,也可能不实用,但我认为这对我来说也是一次反思的练习。

策略:

  • Use getMethods():

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(使用前将#替换为@)

如何通过反射找出方法的可见性? 的相关文章

随机推荐