我几乎肯定有人问过这个问题,但我不知道该找什么。
无论如何,我很好奇是否可以创建一个扩展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我的问题是:它是如何(以及为什么)编译的?
发布于 2018-08-07 01:23:40
在遵从过程中,包(共享名称)合并了吗?
不完全同意。包名唯一标识包。每个名字只有一个。
但是,包成员的Java源代码不必全部驻留在同一个源树中,也不必同时编译。Java编译器将接受类对任何有效包名的声明,并将类接受为它们所处的包中。
另一方面,这并不意味着您可以使用声明为在任何给定JVM中的java.*或javax.*包中的类。标准JVM将拒绝从JVM外部的任何源加载属于这些包的类。您可以构建这样的类,但不能使用它们。通过一种名为"包装密封“的机制,您可以以同样的方式保护您自己的包。
第三,使用未密封的包,您确实可以从多个不同的来源加载包成员。
https://stackoverflow.com/questions/51717382
复制相似问题