2011-11-23 70 views
1

我开发了一个库,我需要该库的用户只能访问一个类(使用几种方法)。使库的方法对于外部访问不可见,但对库可见

对于另一方面,我需要这个类可以访问所有库的方法类。

一个解决方案是将所有的类放在同一个包中,并使所有的方法受到保护,但我不喜欢为不同的目的使用不同类的库。 (就像一个类使用视频和一个类来解析XML)。

现在:

com.aracem.library:
- 类1
- 等级2
- 类3
- 类4
- 5类

我想是这样的

com.aracem.library:
- class 1
com.aracem.library.video
- 类2视频
com.aracem.library.xml
- 类3 XML
- 类4的xml

如何可以定义CLAS 2的方法,3,4(在示例中)让类1访问方法,但不让库的用户访问该方法?

回答

8

由于java没有任何访问控制机制,除了访问修饰符(私有,保护,公共或任何用于包保护访问),我可以向您推荐以下解决方案。

所有的类都应该被封装保护。为了能够从其他包中调用自己的类,请在包中创建公共接口并让您的类实现这些接口。类的实例只能由工厂创建。每包装出厂。工厂类本身是公共的。

现在,客户端代码只有一种可能性访问您的类:使用您的工厂实例化它们。但工厂应该检查来电者的访问权限。很简单:new Throwable().getStackTrace()[0]将返回调用者的堆栈跟踪元素。检查它的包装并决定是否继续或投掷Exception,例如SecurityException

还有其他解决方案。例如,您可以使用方面来包装所有类。例如,使用AspectJ来执行字节码修改并自动插入一些代码。这段代码将检查访问权限并抛出异常,如上所述。这个解决方案可能会更好,但需要您学习一些关于AspectJ的知识。

+0

你怎么看待用其他类创建一个库的想法(在这里是xml和video),并且像.jar一样包含它。这个想法也解决了这个问题,不是吗? – Aracem

相关问题