1

我目前正在编写一些框架代码。最近,我不得不向一个需要公开的类添加一些方法,因为该包之外的类需要访问它。该类的客户也可以访问该类,但我的客户不能访问这些方法 - 我只是希望它们对框架中的其他框架类可见。

将它们标记为公开并没有帮助,因为我的客户也可以访问它。将其标记为受保护或包私有无济于事,因为此类的 java 包之外的框架类需要访问它。

我能做些什么来解决这个问题?

谢谢!

4

7 回答 7

1

我不知道您使用的是什么框架,但如果您有方面,您可以根据调用者或凭据限制对该包的调用。

我很难调和“可以访问课程”和“无法访问的方法”。它是哪一个?如果你不能调用它的方法,那么访问这个类意味着什么?

我想知道您的框架为世界增添了哪些在 Spring 之类的东西中没有更好的功能。

于 2012-10-08T21:47:29.210 回答
0

没有其他我能想到的编译时检查。除了您所描述的之外,Java 没有任何其他可见性修饰符。

如果您想限制某些方法只能由您的框架访问,您应该首先考虑重组您的框架以使用“包私有”可见性级别。public具有非常清晰的语义意味着每个人都可以访问它。如果某些东西仅供您的框架使用,那么它应该是protected或“包私有”,以便其他人无法看到它。

可以在运行时通过使用来检查哪个类调用了您的方法来做一些事情StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(),但这不会很好地执行(因为它会创建一个异常),我会警告不要这样做。

编辑:有一种更有效的方法可以通过使用此处描述的方法来确定调用类。

于 2012-10-08T21:50:29.987 回答
0

阅读您的帖子让我想起了我不久前在 apidesign.org 上读到的名为FriendPackages的内容。我没有使用过这个解决方案,但我认为这是一本有趣的书。

于 2012-10-08T21:53:10.673 回答
0

几个解决方案:

  1. 定义一个“公共”接口,这是您的客户知道的接口,而您的类实现了另一个“内部”接口,该接口扩展了这个“公共”接口。
  2. 使用某种模块管理框架,如OSGIJava8 模块
于 2012-10-08T21:59:06.320 回答
0

其他答案中有一些有趣且有用的建议,尤其是双界面的想法。

但我的看法是,您不应该过于努力地实施访问控制或强制执行 API 纪律。事实是,无论您做什么,人们都可以绕过您提出的任何障碍进行编程,以防止他们的程序使用“内部”接口。阻止这种情况的唯一方法是强制他们在安全沙箱中运行他们的代码。我怀疑这是否可行,更不用说可以接受了。

无论如何,尽量清楚地表明客户代码使用您的内部 API 是一个坏主意。但是不要添加大量额外的代码、昂贵的运行时检查和其他会妨碍的东西。将您的客户视为负责任的成年人。如果他们想忽略你的强烈建议,让他们处理后果。

于 2012-10-09T13:42:29.000 回答
0

当基类属于“框架”包时,通过继承,在包可见性处声明“仅框架”方法。

只有“框架”包可以调用它们。

于 2012-10-08T21:53:28.787 回答
0
  • 创建一个名为MyService
  • 将您最喜欢的方法访问器放在该接口中。
  • 实现两个不同的版本。一个用于远程,一个用于内部使用
  • 为了保护您的方法,return new IllegalAccessException()请为您的客户端版本实现添加。
  • 使用将返回其实现的单例外观:public static MyService getService(Boolean client)
于 2012-10-08T22:07:45.270 回答