在jar文件中隐藏类

问题描述 投票:10回答:8

是否真的不可能在jar文件中隐藏某些类?

我不想允许直接实例化类,以使其更加灵活。该罐子只有工厂(或外墙)可见。

除了创建两个项目,除了解决此问题还有其他方法吗?(两个项目:第一个项目包含类(实现),另一个项目引用第一个项目并包含工厂;稍后仅引用第二个项目)

java jar factory-pattern information-hiding facade
8个回答
3
投票

我想如果您的公共工厂方法尝试返回“隐藏”的东西,您将遇到编译器故障或警告。

否,如果不重新实现自己的ClassLoader或使用OSGi或任何类似的东西,就不能隐藏公共类。

您可以做的是将接口api与实现分开,例如有一个仅包含接口的项目,而另一个包含实现的项目。但是,您仍然无法隐藏实现类。


5
投票

我了解您不是要隐藏实际的类,只是要防止在工厂类之外构造它们。我认为可以通过在类构造函数中使用包私有(默认)可见性来轻松实现。唯一的限制是您需要将类和工厂放在同一个程序包中,因此在中型到大型代码库中,事情可能变得不必要地复杂。


4
投票

如果我正确理解了您的问题,您希望确保库的用户被迫使用工厂来实例化其对象,而不是自己使用构造函数。

正如我所看到的,有两种可能性,一种是愚蠢的,但在少数特定情况下可用,另一种是最实际且可能是最常用的方式。

  1. 您可以将所有课程private inner classes厂。如果有的话,这会工作每班一个工厂,但几乎没有如果你有很多的话可以用被管理的不同类别通过一家工厂。
  2. 您可以使用protected访问修饰符限制访问您的班级构造函数。 这很常见练习在使用factory pattern时。

2
投票

Obfuscation可以帮助您以某种方式>>。


2
投票

对于标准类加载器和普通的旧jar文件,这是不可能的。 OSGi的概念是仅使某些软件包对另一个捆绑包可见(即,将公共api和内部实现分开)。


1
投票

如果您说“不允许直接实例化类以使其更加灵活”,如果我理解正确,那么正确执行的外观模式将对此进行处理。


1
投票

您的问题有两种解决方案,不涉及将所有类都放在同一包中。


0
投票

您可以使用自定义类加载器来完成这些魔术,但是:

© www.soinside.com 2019 - 2024. All rights reserved.