包(共享名称)在编译期间是否合并?
Are packages (that share a name) combined during compliation?
我几乎可以肯定有人问过这个问题,但我不确定要搜索什么。
无论如何,我很好奇是否可以创建一个扩展 ByteBuffer
的 class。我认为这是不可能的,因为 ByteBuffer
有包私有构造函数:
// package-private
ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
super(mark, pos, lim, cap);
this.hb = hb;
this.offset = offset;
}
// Creates a new buffer with the given mark, position, limit, and capacity
//
ByteBuffer(int mark, int pos, int lim, int cap) { // package-private
this(mark, pos, lim, cap, null, 0);
}
但是,我发现如果您在与其父级共享名称的包中创建 class,那么它可以完美编译。
package java.nio;
public class Test extends ByteBuffer {
Test(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
super(mark, pos, lim, cap, hb, offset);
}
@Override
public ByteBuffer slice() {
return null;
}
...
}
它在Java 9和Java 10中也编译,但只有在编译时使用--patch-module
:
javac --patch-module java.base=. java/nio/Test.java
我的问题是:如何(以及为什么)编译?
Are packages (that share a name) combined during compliation?
不完全是。包名称 唯一地 标识一个包。每个名字只有一个。
但是包成员的 Java 源代码不必全部驻留在同一源代码树中或同时编译。 Java 编译器将接受您的 类' 任何有效包名称的声明,并接受您的 类 在他们所说的包中。
另一方面,这并不意味着您可以 使用您声明在 java.*
或 javax.*
中的 类在任何给定的 JVM 中打包。标准 JVM 将拒绝从 JVM 外部的任何来源加载属于这些包的 类。你可以构建这样的 类 但你不能使用它们。您可以通过一种名为“package sealing”的机制以大致相同的方式保护您自己的包。
另一方面,对于未密封的包,您确实可以从多个不同的来源加载包成员。
我几乎可以肯定有人问过这个问题,但我不确定要搜索什么。
无论如何,我很好奇是否可以创建一个扩展 ByteBuffer
的 class。我认为这是不可能的,因为 ByteBuffer
有包私有构造函数:
// package-private
ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
super(mark, pos, lim, cap);
this.hb = hb;
this.offset = offset;
}
// Creates a new buffer with the given mark, position, limit, and capacity
//
ByteBuffer(int mark, int pos, int lim, int cap) { // package-private
this(mark, pos, lim, cap, null, 0);
}
但是,我发现如果您在与其父级共享名称的包中创建 class,那么它可以完美编译。
package java.nio;
public class Test extends ByteBuffer {
Test(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
super(mark, pos, lim, cap, hb, offset);
}
@Override
public ByteBuffer slice() {
return null;
}
...
}
它在Java 9和Java 10中也编译,但只有在编译时使用--patch-module
:
javac --patch-module java.base=. java/nio/Test.java
我的问题是:如何(以及为什么)编译?
Are packages (that share a name) combined during compliation?
不完全是。包名称 唯一地 标识一个包。每个名字只有一个。
但是包成员的 Java 源代码不必全部驻留在同一源代码树中或同时编译。 Java 编译器将接受您的 类' 任何有效包名称的声明,并接受您的 类 在他们所说的包中。
另一方面,这并不意味着您可以 使用您声明在 java.*
或 javax.*
中的 类在任何给定的 JVM 中打包。标准 JVM 将拒绝从 JVM 外部的任何来源加载属于这些包的 类。你可以构建这样的 类 但你不能使用它们。您可以通过一种名为“package sealing”的机制以大致相同的方式保护您自己的包。
另一方面,对于未密封的包,您确实可以从多个不同的来源加载包成员。