但我的意图是以逻辑方式向用户客户端隐藏应用程序的较低层,这意味着实际上不使用单独的 jvm 或应用程序服务器。
如果这些“用户客户端”在同一个 JVM 甚至同一个应用程序(例如同一个 .war、同一个 .ear)中运行,那么您所寻求的安全级别只是表面的。基本上,你是在保护你自己的同事或队友(通常,“用户客户端”是外部客户端,从不同的机器上运行,通过 Internet 与你联系)。
在 Java EE EAR 应用程序中存在一些分层,但这些层的存在是为了防止业务逻辑直接访问视图逻辑。例如,较低级别的层不能访问较高级别的层。这些层通过类加载器隔离相互保护。具体来说,每个 Web 模块都位于层次结构的底部,其他模块(甚至不是其他 Web 模块)无法直接访问其中的代码。EJB 模块是向下的一层,所有 Web 模块以及其他 EJB 模块都可以访问其中的代码。最后是顶层 EAR,它不算作一个模块,但可以包含实用程序代码,这些代码不能直接访问模块中的代码,但可以被所有模块使用(因此是跨层的,Web 模块)也可以直接访问)。
Java EE 中的模块系统似乎与您想要的不同。它隐藏了更高的层,而不是更低的层。
通过将多个“协作”应用程序部署到同一个应用程序服务器,可以实现额外级别的模块隔离。然后,您可以将 EJB bean 的远程接口定义为您试图隐藏的逻辑的网关(外观)。请注意,许多应用程序服务器也允许部署到同一 AS 的其他应用程序从 JNDI 请求本地 EJB,即使 EJB 规范不要求这样做(但也没有禁止)。
此外,还有私有和受保护访问修饰符的常用机制,但这些更适合保护您免受编码错误的影响。反射技巧很容易通过它们。
然后是安全经理。如果您不信任来自您自己的队友(“用户客户端”)的代码,您可能需要考虑使用这些代码。它们的使用可能具有挑战性,但可能正是您想要的。