Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jar中创建不可见类_Java_Jar - Fatal编程技术网

Java 在jar中创建不可见类

Java 在jar中创建不可见类,java,jar,Java,Jar,如何在java中创建一个jar,只有一个类对jar用户可见(公共) 我知道我可以从类的声明中省略“public”,这使得它只对该包可见,但是在一个包含多个包的jar中,当可见性应该对jar内的所有类公开,而不是对jar外的所有类公开时,我该如何做呢?您必须将所有类包含在一个Java包中,并且省略类定义中的“public”修饰符 我建议您不要这样做。如果您想指出库的客户端不应该使用某个类,请将其放入名为“impl”或“internal”的包中“并且不提供公共文档。使用受保护的作为修饰符是否可以解决

如何在java中创建一个jar,只有一个类对jar用户可见(公共)


我知道我可以从类的声明中省略“public”,这使得它只对该包可见,但是在一个包含多个包的jar中,当可见性应该对jar内的所有类公开,而不是对jar外的所有类公开时,我该如何做呢?

您必须将所有类包含在一个Java包中,并且省略类定义中的“public”修饰符


我建议您不要这样做。如果您想指出库的客户端不应该使用某个类,请将其放入名为“impl”或“internal”的包中“并且不提供公共文档。

使用
受保护的
作为修饰符是否可以解决此问题?我知道它确实允许访问继承的类,但我不知道包中的所有其他类。

您基本上是在寻找与.Net程序集范围的可见性相对应的Java类。恐怕您在当前Java的框架内不具备这种能力。Java的未来版本将为模块提供更好的支持,这应该允许类似的东西。

这只是一个疯狂的想法,但您可以使用自定义类加载器,从
.jar
加载文件,否则这些文件不会被识别为类

例如,您可以通过加密类文件并使用自己的文件扩展名存储它们,然后通过自定义类加载器从类用户可见的“main”类从jar加载和解密它们来对类文件进行后处理。(警告;我本人从未尝试过做类似的事情:-)


另一种方法(如果代码库不是太大)可能是像普通方法一样开发类,在包结构上运行测试,并且作为打包之前的最后一步,使用(perl)脚本通过将所有其他类作为私有静态内部类插入并重新生成主类来重建主类。将此转换用作预包步骤意味着您可以在sane结构中开发,同时将实现类隐藏在jar中。

我不能100%确定“每个.java文件必须有一个公共类”部分。事实上,我很确定事实并非如此,包可访问类很好。@Hovercraft:你说得对,这让事情变得非常不同。那么我如何在jar文件的其他包的impl文件夹中使用这些类:/?@AmirZiarati-如果类不是
公共的
,你就不能。这就是为什么这不是一个好主意。如果它们是
公共的
,只需像往常一样使用即可。protected将允许包中的任何类访问它。然而,这并不一定意味着罐子。您可能需要查看签名JAR: