Ten konstruktor jest publiczny, ponieważ jest używany poza java.io
.
Ćwiczenia wykorzystujące new FileDescriptor()
w JRE 7u4 Linux x86:
java.io.FileInputStream
java.io.FileOutputStream
java.io.RandomAccessFile
java.lang.UNIXProcess
java.net.AbstractPlainDatagramSocketImpl
java.net.AbstractPlainSocketImpl
java.net.ServerSocket
sun.net.sdp.SdpSupport
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileDispatcherImpl
sun.nio.ch.IOUtil
sun.nio.ch.PipeImpl
sun.nio.ch.SctpServerChannelImpl
sun.nio.ch.ServerSocketChannelImpl
sun.nio.ch.UnixAsynchronousServerSocketChannelImpl
sun.nio.fs.UnixChannelFactory
Jest sun.misc.SharedSecrets
metoda, która pozwala programiście zmienić stan na FileDescriptor
do ważnego jeden (ten fragment znaleźć w java.io.FileDescriptor
):
static {
sun.misc.SharedSecrets.setJavaIOFileDescriptorAccess(
new sun.misc.JavaIOFileDescriptorAccess() {
public void set(FileDescriptor obj, int fd) {
obj.fd = fd;
}
public int get(FileDescriptor obj) {
return obj.fd;
}
public void setHandle(FileDescriptor obj, long handle) {
obj.handle = handle;
}
public long getHandle(FileDescriptor obj) {
return obj.handle;
}
}
);
}
Oznacza to, że każdy kod, który może uzyskać dostęp do SharedSecrets
(np. Sam JRE), może również utworzyć własny poprawny FileDescriptor
, dlatego powinien mieć dostęp FileDescriptor()
. Jednak nie ma możliwości ograniczenia dostępu konstruktora tylko do klas JRE, więc jest on publiczny.
Pytasz niewłaściwych ludzi w niewłaściwym miejscu. Otrzymasz wiele opinii i zgadywania, przynajmniej do czasu, gdy pytanie zostanie zamknięte, ponieważ nie jest konstruktywne, ale jedyne osoby, które rzeczywiście wiedzą, są mało prawdopodobne, aby je tu znaleźć. – EJP
@ s106mo Nie zgadzam się, że to pomyłka, i nie zgadzam się z OP, że nie ma na to celu: to tylko pytanie. Być może planowali np. Java.net. Gniazdo do korzystania z niego. Nie wiemy. – EJP
@ s106mo * przez pomyłkę * nie powinno być satysfakcjonującą odpowiedzią, ponieważ nie jest poprawna. Jest powód, zobacz moją odpowiedź. – Jeffrey