JavaDoc for java.io.FileDescriptor.FileDescriptor() says:
Constructs an (invalid) FileDescriptor object.
If there is no purpose for the constructor, why is it's access level not declared to be package-private?
This constructor is public because it is used outside of java.io
.
Classes using new FileDescriptor()
in 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
There is a sun.misc.SharedSecrets
method that allows the programmer to change the state of a FileDescriptor
to a valid one (this snippet found in 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;
}
}
);
}
This means that any code that can access SharedSecrets
(I.E. the JRE itself) can also create its own valid FileDescriptor
, and should therefore be allowed to access FileDescriptor()
. However, there is no way to restrict the access of a constructor to only JRE classes, so it is public.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With