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

时间:2014-05-21 15:12:35

标签: java reflection visibility access-modifiers

上下文:

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

测试'immutability invariant'(你能这么说吗?)我想我会通过反射调用类中的所有公共方法,然后检查该类之后是否没有改变。这样我以后不太可能不小心打破不变量。这可能或者可能不是实际/有效的,但我认为这对我来说也是一种反思。

策略:

  • 使用getMethods()

使用getMethods(),我只获得公共接口,但当然这包括所有继承的方法。 那么问题是wait()和notify()等方法会导致InvocationTargetExceptions,因为我没有同步等...

  • 使用getDeclaredMethods()

(天真?)假设只有我声明的方法能够破坏类的不变性,我尝试使用getDeclaredMethods()代替。 不幸的是,这会调用在类中声明的所有方法,private和public,而不是超类。私人方法显然不相关,因为它们被允许打破不变性。

问题:

所以我的问题是,我怎样才能知道通过getDeclaredMethods()获得的方法是否公开,以便我可以通过反射调用它?在浏览文档时没有任何事情跳出来......

我可以看到解决这个问题的其他方法,比如特别忽略像wait()等方法,但这看起来比我能处理的更糟糕。

2 个答案:

答案 0 :(得分:12)

作为mentioned in the comments,您可以使用Method.getModifiers()来确定与该方法相关联的修饰符。

E.g。

if (Modifier.isPublic(someMethod.getModifiers()) {
  // etc.
}

答案 1 :(得分:1)

还有另一种方法可以做到这一点。如果你做了类似Modifier.toString(m.getModifiers())的事情; 它将返回一串可见性。如果您只想弄清楚可见性,这非常有用。如果您正在尝试测试特定类型(如果可见性是公开的,那么只做某事),那么此处提供的其他答案也同样适用!