Если я правильно понял, вам в основном нужно socket.getImpl().getFileDescriptor().fd
.Ни один из этих методов / полей не является общедоступным, оставляя отражение в качестве единственной опции:
static int getHandle(Socket socket) throws ReflectiveOperationException {
Method getImpl = Socket.class.getDeclaredMethod("getImpl");
getImpl.setAccessible(true);
SocketImpl impl = (SocketImpl) getImpl.invoke(socket);
Method getFileDescriptor = SocketImpl.class.getDeclaredMethod("getFileDescriptor");
getFileDescriptor.setAccessible(true);
FileDescriptor fileDescriptor = (FileDescriptor) getFileDescriptor.invoke(impl);
Field fd = FileDescriptor.class.getDeclaredField("fd");
fd.setAccessible(true);
return (int) fd.get(fileDescriptor);
}
Начиная с Java 9, это сопровождается кучей предупреждений:
ПРЕДУПРЕЖДЕНИЕ: произошла недопустимая операция доступа с отражением
...
ПРЕДУПРЕЖДЕНИЕ: Все недопустимые операции доступа будут отклонены в следующем выпуске
В заключение, (просто)Java, вероятно, не подходит для этого требования.