我正在编写一些框架代码。最近,我不得不在一个需要公开的类中添加一些方法,因为该类之外的类需要访问它。 该类的客户端也可以访问该类,但我没有这些方法可以被我的客户端访问 - 我只是希望它们对框架中的其他框架类可见。
将它们标记为公开并没有帮助,因为我的客户也可以访问它。 将其标记为受保护或包私有没有帮助,因为此类java包之外的框架类需要访问它。
我该怎么做才能解决这个问题?
谢谢!
答案 0 :(得分:1)
我不知道你正在使用什么框架,但如果你有方面,你可以根据来电或凭证限制对该套餐的调用。
我很难协调“有权访问课程”和“无法访问的方法”。这是什么?如果你不能调用它的方法,对类的访问意味着什么?
我想知道你的框架增加了什么样的东西,而不像Spring那样更好。
答案 1 :(得分:0)
我可以想到,您无法进行其他编译时检查。除了您描述的那个之外,Java没有任何其他可见性修饰符。
如果要限制某些方法只能由框架访问,则应首先考虑重构框架以使用“包私有”可见性级别。 public
有一个非常明确的语义,意味着每个人都可以访问它。如果某些内容仅供您的框架使用,那么它应该是protected
或“包私有”,以便其他任何人都无法看到它。
你可以在运行时通过使用StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
检查哪个类调用你的方法来做某事,但这不会很好(因为它会产生异常)和我谨慎对待它。
编辑:通过使用here描述的方法,可以更有效地找出调用类。
答案 2 :(得分:0)
阅读您的帖子,提醒我之前在apidesign.org上发布的一些名为FriendPackages的内容。我没有使用过这个解决方案,但我认为这是一个有趣的阅读。
答案 3 :(得分:0)
当基类属于“框架”包时继承,在包可见性时声明“仅框架”方法。
只有“框架”包可以调用它们。
答案 4 :(得分:0)
一些解决方案:
答案 5 :(得分:0)
MyService
return new IllegalAccessException()
。 public static MyService getService(Boolean client)
答案 6 :(得分:0)
在其他答案中有一些有趣且有用的建议,特别是双界面的想法。
但我的看法是你不应该太努力实现访问控制或强制执行API规则。事实上,无论你做什么,人们都能够围绕你提出的任何障碍进行编程,以防止他们的程序使用“内部”接口。唯一可以阻止它的方法是强制它们在安全沙箱中运行它们的代码。我怀疑这是否切实可行,更不用说可以接受了。
无论如何,尽量让它尽可能清楚地表明客户代码使用内部API是一个糟糕的IDEA。但是不要添加大量额外的代码,昂贵的运行时检查以及其他会阻碍的东西。将您的客户视为负责任的成年人如果他们想忽视你的强烈建议,就让他们处理后果。