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