Java 通过创建相同的包名称获得对包访问成员的访问权限
我有一个问题,是关于我突然想到的一种获取包访问成员访问权限的偷偷摸摸的方法。具体来说,我想扩展一个类,我们称之为Java 通过创建相同的包名称获得对包访问成员的访问权限,java,inheritance,packages,Java,Inheritance,Packages,我有一个问题,是关于我突然想到的一种获取包访问成员访问权限的偷偷摸摸的方法。具体来说,我想扩展一个类,我们称之为com.acme.Foo,以添加一些功能。这是纯粹的添加:所有当前的Foo方法都只需委托给超类的方法即可得到支持。但是,没有可访问的Foo构造函数,因此我无法扩展该类,并且我的实现将无法通过作为Foo的“isA”测试。没有一个接口可以表达我可以用来代替继承的Foo-ness 这就是我突然想到的:Foo有一个包访问构造函数,那么为什么不在我的源文件夹中创建一个包com.acme,并在该包
com.acme.Foo
,以添加一些功能。这是纯粹的添加:所有当前的Foo
方法都只需委托给超类的方法即可得到支持。但是,没有可访问的Foo
构造函数,因此我无法扩展该类,并且我的实现将无法通过作为Foo
的“isA”测试。没有一个接口可以表达我可以用来代替继承的Foo
-ness
这就是我突然想到的:Foo
有一个包访问构造函数,那么为什么不在我的源文件夹中创建一个包com.acme
,并在该包中创建一个InheritableFoo
类:
package com.acme;
public class InheritableFoo extends Foo {
public InheritableFoo() {
super();
}
}
现在我可以通过扩展InheritableFoo
来实现对Foo
的扩展,因为它确实有一个可访问的构造函数
这感觉完全错误,而且有点不道德:我不尊重原始程序员在决定不公开
Foo
的构造函数时所做的决定。但可能的情况是,他们只是采取了“在有理由之前否认一切”的方法。不管怎样,这个想法有什么根本性的错误吗?如果我走这条路,将来会给自己带来问题吗?如果会,原因是什么?您可以将自己的类“潜入”到另一个包中,并访问包限制元素,这一点是正确的
但是,这只会在com.acme.foo
的作者将其代码作为源代码或未密封的包分发时发生。如果这个包的作者将它作为一个密封的罐子分发(我相信这很常见),那么您的方法将不再有效
从
JAR文件中的包可以选择密封,这意味着
该包中定义的所有类都必须归档在同一个JAR中
文件