使库的方法对外部访问不可见,但对库可见
Posted
技术标签:
【中文标题】使库的方法对外部访问不可见,但对库可见【英文标题】:Make the methods of a library not visible for external access but visible for the library 【发布时间】:2012-01-04 16:45:53 【问题描述】:我开发了一个库,我需要该库的用户只能访问一个类(使用几种方法)。
另一方面,我需要这个类可以访问所有库的方法类。
一种解决方案是将所有类放在同一个包中并保护所有方法,但我不喜欢为不同目的使用具有不同类的库。 (就像一个使用视频的类和一个解析 XML 的类)在同一个包中。
现在:
com.aracem.library: - 1 级 - 2级 - 3级 - 4级 - 5级
我想要这样的东西
com.aracem.library: - 1 级 com.aracem.library.video - 第 2 课视频 com.aracem.library.xml - 3 类 xml - 第 4 类 xml
如何定义 clas 2 、 3 、 4 的方法(在示例中)以让 1 类访问这些方法但不让库的用户访问这些方法?
【问题讨论】:
【参考方案1】:由于除了访问修饰符(私有、受保护、公共或无包保护访问)之外,java 还没有任何访问控制机制,我可以建议您以下解决方案。
所有类都应该受到包保护。为了能够从其他包中调用您自己的类,请在您的包中创建公共接口并让您的类实现这些接口。类的实例只能由您的工厂创建。每个包装放工厂。工厂类本身是公共的。
现在,客户端代码只有一种可能访问您的类:使用您的工厂实例化它们。但是工厂应该检查调用者的访问权限。很简单:new Throwable().getStackTrace()[0]
返回调用者的堆栈跟踪元素。检查它的包并决定是继续还是扔Exception
,例如SecurityException
.
还有其他解决方案。例如,您可以使用方面包装所有类。例如使用执行字节码修改并自动插入一些代码的 AspectJ。该代码将检查访问权限并抛出异常,如上所述。这个解决方案可能更好,但需要您了解一些关于 AspectJ 的知识。
【讨论】:
您如何看待使用其他类(在本例中为 xml 和视频)创建一个库并将其像 .jar 一样包含在内的想法。这个想法也解决了问题,不是吗?以上是关于使库的方法对外部访问不可见,但对库可见的主要内容,如果未能解决你的问题,请参考以下文章
public private protected 三种访问修饰符在c#中的区别