我开发了一个库,我需要该库的用户只能访问一个类(使用几种方法)。
对于另一方面,我需要这个类可以访问所有库的方法类。
一种解决方案是将所有类放在同一个包中并使所有方法受到保护但我不喜欢为不同目的使用具有不同类的库。 (就像一个使用视频的类和一个解析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
如何定义第2,3,4条(在示例中)的方法,让类1访问方法,但不要让库的用户访问这些方法?
答案 0 :(得分:9)
由于java除了访问修饰符(私有,受保护,公共或没有任何包受保护的访问)之外还没有任何访问控制机制,我可以建议您使用以下解决方案。
所有类都应受包保护。为了能够从其他包中调用您自己的类,请在包中创建公共接口,并使您的类实现这些接口。类的实例只能由您的工厂创建。每包装工厂。工厂类本身就是公开的。
现在,客户端代码只有一种可能性来访问您的类:使用您的工厂实例化它们。但是工厂应该检查来电者的访问权限。很简单:new Throwable().getStackTrace()[0]
返回调用者的堆栈跟踪元素。检查其包裹并决定是继续还是抛出Exception
,例如SecurityException
。
还有其他解决方案。例如,您可以使用方面包装所有类。例如,使用AspectJ执行字节代码修改并自动插入一些代码。此代码将检查访问权限并抛出异常,如上所述。这个解决方案可能更好,但需要您学习一下AspectJ。