我几乎可以肯定已经问过这个问题了,但是我不确定要搜索什么。
无论如何,我很好奇是否可以创建扩展ByteBuffer
的类。我认为这是不可能的,因为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);
}
但是,我发现如果您在与父代共享一个名称的包中创建类,那么它可以完美地编译。
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
我的问题是:如何(以及为什么)编译?
答案 0 :(得分:3)
在编译过程中是否合并了(共享名称)软件包?
不完全是。包名称唯一标识一个包。每个名称只有一个。
但是包成员的Java源代码不必全部驻留在同一源代码树中或在同一时间编译。 Java编译器将接受您的类对任何有效包名称的声明,并接受您的类位于它们所声明的包中。
另一方面,这并不意味着您可以使用声明为在任何给定JVM中的java.*
或javax.*
包中的类。标准JVM将拒绝从JVM外部的任何源加载属于那些包的类。您可以构建此类,但不能使用它们。您可以通过称为“ package sealing”的机制以几乎相同的方式保护自己的软件包。
另一方面,使用未密封的包装,您确实可以从多个不同的来源加载包装成员。