【问题标题】:How can I find out what a method's visibility is via reflection?如何通过反射找出方法的可见性?
【发布时间】:2014-07-10 08:03:54
【问题描述】:

上下文:

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

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

策略:

  • 使用getMethods():

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

  • 使用getDeclaredMethods():

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

问题:

所以我的问题是,我怎样才能知道通过getDeclaredMethods() 获得的方法是否是公共的,以便我可以通过反射调用它?翻阅文档时,我没有任何反应...

我可以看到解决此问题的其他方法,例如专门忽略 wait() 等方法,但这似乎比我能处理的还要复杂。

【问题讨论】:

  • @JBNizet 为什么不把这个作为答案呢?
  • @MarkW 1. 懒惰。 2.让OP意识到只需阅读javadoc就可以回答这样的问题。
  • @JBNizet 马克说了什么。我想我需要更深入地查看文档。我确实看过它们,正如我所说,没有什么“跳出来”!如果您不想添加答案,我很乐意自己做。

标签: java reflection visibility access-modifiers


【解决方案1】:

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

例如

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多