上下文:
我正在尝试学习/实践TDD,并决定需要创建一个不可变的类。
为了测试"不变性不变量"(你能这么说吗?(我想我只需要通过反射调用类中的所有公共方法,然后检查类之后是否没有更改。这样我以后就不太可能不小心打破不变量了。这本身可能实用,也可能不实用,但我认为这对我来说也是一次反思。
策略:
- 使用
getMethods()
:
使用getMethods()
,我只获得了公共接口,当然这也包括所有继承的方法。问题是wait((和notify((等方法会导致InvocationTargetException,因为我还没有同步等等
- 使用
getDeclaredMethods()
:
(天真地?(假设只有我声明的方法才能破坏类的不变性,我尝试使用getDeclaredMethods()
。不幸的是,这会调用类中声明的所有方法,私有和公共方法,但不会调用超类。私有方法显然是不相关的,因为它们被允许打破不变性。
问题:
所以我的问题是,我如何找出通过getDeclaredMethods()
获得的方法是否是公共的,以便我可以通过反射调用它?没有什么东西从我身上跳出来。。。
我可以看到解决这个问题的其他方法,比如专门忽略wait((等方法,但这似乎比我能处理的还要棘手。
如注释中所述,您可以使用Method.getModifiers()
来确定与该方法关联的修饰符。
例如
if (Modifier.isPublic(someMethod.getModifiers()) {
// etc.
}
还有另一种方法。如果您执行类似Modifier.toString(m.getModifiers(((的操作;它将返回一个可见性字符串。如果您只是想弄清楚可见性,这将非常有用。如果你正在尝试测试特定类型(比如只在可见性为公共的情况下做一些事情(,那么这里提供的另一个答案也同样有效!