我有一个现有的类,我想添加一个方法.但我希望只从特定类的特定方法调用该方法.有什么方法可以阻止来自其他类/方法的调用吗?
例如,我有一个现有的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
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的一种方法是获取StackTrace内部method()然后确认父方法?
我正在寻找的解决方案是更清洁和可取的解决方案,如模式或其他东西.
说实话,你已经在这里画了一个角落.
如果A类和B类不相关而不是同一个包的成员,那么可见性将无法解决问题.(即使它确实如此,也可以使用反射来破坏可见性规则.)
如果代码可以使用反射来调用方法,则静态代码分析将无法解决问题.
传递和检查B.this作为额外的参数A.method(...)没有帮助,因为其他一些类C可以传递一个B实例.
这只留下了栈跟踪方法1 ...或者放弃并依赖于程序员的良好意识2而不是调用他们不应该的方法.
理想的解决方案是重新审视让您陷入困境的设计和/或编码决策.
1 - 有关使用注释,安全管理器等的示例,请参阅其他答案,以隐藏应用程序编程人员的堆栈跟踪内容.但请注意,在引擎盖下,每个方法调用可能会增加数百个,可能是数千个指令.
2 - 不要低估程序员的良好意识.大多数程序员在看到不打电话给某些方法的建议时,可能会遵循这个建议.
执行此操作的正确方法是SecurityManager.
定义一个所有想要调用的代码必须拥有的权限A.method(),然后只确认B并A拥有该权限(这也意味着没有类具有AllPermission).
在A,你检查这个System.getSecurityManager().checkPermission(new BMethodPermission()),并在B你调用里面的方法AccessController.doPrivileged(...).
当然,这需要安装一个安全管理器(并且它使用合适的策略) - 如果不是,则所有代码都是可信的,每个人都可以调用所有内容(如果需要,使用Reflection).
小智 6
您可以考虑使用界面.如果您正在传入调用类,则可以确认该类是否为适当的类型.
或者,如果您使用的是Java,则可以使用"默认"或"包"级别访问(例如,void method()与public void method()).这将允许您的方法由包内的任何类调用,并且不要求您将类传递给该方法.
| 归档时间: |
|
| 查看次数: |
7796 次 |
| 最近记录: |