我需要处理通过反射调用私有方法的情况吗?


12

创建库时,当不是由同一类的其他方法调用,而是由其他库通过反射调用时,我是否必须确保私有方法必须按预期工作?

例如,如果私有方法private DoSomething(int number)期望:

  • number 是一个非零的正整数,并且:
  • 私有变量string abc不是null也不是空字符串,

和完全的,丑陋的失败,如果这两个条件不匹配,我必须处理这些故障,即使我知道,在类的所有方法 always¹分配非空值abc调用之前DoSomething,并通过这种积极的非零整数方法?

换句话说,不是通过反射进行不安全调用保护的代码可以被认为是低质量代码,还是属于使用反射来确保调用不会中断任何内容的调用方?

注意:我的问题仅涵盖一组标准库。这不包括必须高度安全的代码(即,当有人可能通过使用反射来使其表现出意外行为或崩溃时感兴趣)。


¹因为正确记录了该类,所以因为有足够的单元测试来确保任何其他开发人员都不会破坏此方法,等等。


派生类将能够调用私有方法吗?
oenone

Answers:


16

通过将您的方法标记为私有,您可以确定自己的意图和合同。通过使用反射,客户代码可以选择违反此合同,因此必须承担后果。协议也会发生同样的事情,因为必须遵循工作规则,否则会发生不好的事情。

其他语言(例如C ++)也可能发生相同的问题,我看到类似

#define private public

总而言之-您无需处理这些情况,呼叫者应该了解得更多。


3
我见过人们将类强制转换为(unsigned char *),并直接写入要更改的成员变量的内存偏移量。我的眼睛流血了。
肖恩D.

6
我要补充一点,保护您的类免受危险的特权代码的侵害基本上是不可能的。如果您设法以某种方式保护自己免受不当使用反射的侵害,那么有人可能会找到另一种破坏您一天的方法,方法可能是直接覆盖过程内存。防御性编码最终会达到收益递减的地步,而反思已经超越了这一点。
2011年

5

如果有人使用反射调用您的私有方法,则表明有人在做错事。他要么以非设计的方式使用了代码,要么您隐藏了太多的内部工作并愚弄了API。

但这听起来好像您还没有到那个阶段,而只是想先发制人。所以我的看法是:不用担心。私有方法应被视为禁止使用;如果有人故意违反这些限制,那么事情就爆炸了,这就是他们的问题。


0

好吧,在使用非局部变量之前总是一个好主意,但是除此之外,我不会担心。就像其他人所说的那样,您首先通过将方法私有化来确立了自己的意图。从您的班级外部调用它的任何人都无法享有零保证。在Java中工作时,我什至不给自己的私有方法添加javadoc注释,因为我不希望其他开发人员甚至知道他们在那里。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.