我相信你的方法会奏效,但你应该问问自己这是否值得。它会影响代码的可读性。
您是否试图防止对这些软件包的故意或意外滥用?
如果您试图防止故意滥用,您的方法不会完全解决它;因为反射可用于覆盖对方法/构造函数/等的访问。例如
Communicator communicator = ...;
Constructor<ObjA> constructor = ObjA.class.getConstructor(Communicator.class);
constructor.setAccessible(true);
ObjA objectFromA = constructor.newInstance(communicator);
如果您可以控制 Java 运行时,那么可以使用安全管理器来防止这种事情发生。
也可能有一些事情可以用 ClassLoaders 来控制一个模块对另一个模块的访问。一个类使用自己的 ClassLoader 加载其他类;自定义 ClassLoader 可以防止访问另一个模块的私有部分。这是(我相信)OSGi 如何控制模块之间的访问。
涉及安全管理器或类加载器的解决方案需要您对所使用的 java 运行时进行一些控制。
如果您只是想防止意外误用,您最好依靠包命名来让人们清楚他们不应该使用这些类。例如package foo.bar.internal;
您的团队/公司以外的人会使用这些软件包吗?
如果您对将使用您的代码的模块的构建环境有一些影响,您可以考虑在构建配置中添加工具以禁止使用您的私有包。例如Checkstyle 的 Import Control 检查对可以从何处导入哪些包提供了很多控制。