我有一个现有的类,我想在其中添加一个方法。但我希望只从特定类的特定方法调用该方法。有什么方法可以阻止其他类/方法的调用吗?
比如我有一个现成的A类
public final class A
{
//other stuff available for all classes/methods
//I want to add a method that does its job only if called from a specific method of a class, for example:
public void method()
{
//proceed if called from Class B.anotherMethod() else throw Exception
}
}
一种方法是在 method()
中获取 StackTrace
然后确认父方法?
我正在寻找的是一种更干净、更可取的解决方案,例如模式或其他东西。
最佳答案
老实说,你在这里把自己逼到了墙角。
如果类 A 和 B 不相关且不属于同一包,则可见性无法解决问题。 (即使是这样,反射也可以用来破坏可见性规则。)
如果代码可以使用反射调用方法,静态代码分析将无法解决问题。
将 B.this
作为额外参数传递并检查到 A.method(...)
没有帮助,因为一些其他类 C
可以传递一个 B
实例。
这只剩下堆栈跟踪方法1...或者放弃并依靠程序员的良好感觉2不要调用他们不应该调用的方法。
理想的解决方案是重新审视让您陷入困境的设计和/或编码决策。
1 - 请参阅其他答案,了解使用注释、安全管理器等向应用程序程序员隐藏堆栈跟踪内容的示例。但请注意,在幕后,您每次方法调用可能会添加成百上千条指令开销。
2 - 不要低估程序员的判断力。大多数程序员在看到不要调用某些方法的建议时,很可能会遵循该建议。
关于java - 如何防止从特定类调用公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486797/