我目前正在编写一些框架代码。最近,我不得不向一个需要公开的类添加一些方法,因为该包之外的类需要访问它。该类的客户也可以访问该类,但我的客户不能访问这些方法 - 我只是希望它们对框架中的其他框架类可见。
将它们标记为公开并没有帮助,因为我的客户也可以访问它。将其标记为受保护或包私有无济于事,因为此类的 java 包之外的框架类需要访问它。
我能做些什么来解决这个问题?
谢谢!
我目前正在编写一些框架代码。最近,我不得不向一个需要公开的类添加一些方法,因为该包之外的类需要访问它。该类的客户也可以访问该类,但我的客户不能访问这些方法 - 我只是希望它们对框架中的其他框架类可见。
将它们标记为公开并没有帮助,因为我的客户也可以访问它。将其标记为受保护或包私有无济于事,因为此类的 java 包之外的框架类需要访问它。
我能做些什么来解决这个问题?
谢谢!
我不知道您使用的是什么框架,但如果您有方面,您可以根据调用者或凭据限制对该包的调用。
我很难调和“可以访问课程”和“无法访问的方法”。它是哪一个?如果你不能调用它的方法,那么访问这个类意味着什么?
我想知道您的框架为世界增添了哪些在 Spring 之类的东西中没有更好的功能。
没有其他我能想到的编译时检查。除了您所描述的之外,Java 没有任何其他可见性修饰符。
如果您想限制某些方法只能由您的框架访问,您应该首先考虑重组您的框架以使用“包私有”可见性级别。public
具有非常清晰的语义意味着每个人都可以访问它。如果某些东西仅供您的框架使用,那么它应该是protected
或“包私有”,以便其他人无法看到它。
您可以在运行时通过使用来检查哪个类调用了您的方法来做一些事情StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
,但这不会很好地执行(因为它会创建一个异常),我会警告不要这样做。
编辑:有一种更有效的方法可以通过使用此处描述的方法来确定调用类。
阅读您的帖子让我想起了我不久前在 apidesign.org 上读到的名为FriendPackages的内容。我没有使用过这个解决方案,但我认为这是一本有趣的书。
其他答案中有一些有趣且有用的建议,尤其是双界面的想法。
但我的看法是,您不应该过于努力地实施访问控制或强制执行 API 纪律。事实是,无论您做什么,人们都可以绕过您提出的任何障碍进行编程,以防止他们的程序使用“内部”接口。阻止这种情况的唯一方法是强制他们在安全沙箱中运行他们的代码。我怀疑这是否可行,更不用说可以接受了。
无论如何,尽量清楚地表明客户代码使用您的内部 API 是一个坏主意。但是不要添加大量额外的代码、昂贵的运行时检查和其他会妨碍的东西。将您的客户视为负责任的成年人。如果他们想忽略你的强烈建议,让他们处理后果。
当基类属于“框架”包时,通过继承,在包可见性处声明“仅框架”方法。
只有“框架”包可以调用它们。
MyService
return new IllegalAccessException()
请为您的客户端版本实现添加。 public static MyService getService(Boolean client)