FdMirror.java

package eu.javaexperience.reflect;

import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.Socket;

public class FdMirror
{	
	private static final Field fdVal;
	
	static
	{
		Field f = null;
		try {
			f = FileDescriptor.class.getDeclaredField("fd");
			f.setAccessible(true);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		
		fdVal = f;
	}
	
	public static int getFD(FileDescriptor fd)
	{
		try
		{
			return fdVal.getInt(fd);
		}
		catch(Exception e)
		{
			throw new RuntimeException("Az állományleírók kiolvasása nem lehetséges",e);
		}
	}
	
	private static Class<?> sockFileDes = null;
	
	
	static
	{
		Socket.class.toString();
		try
		{
			Class.forName("java.net.AbstractPlainSocketImpl");
		}
		catch(Exception e){}
	}
	
	public static boolean isGettingFileDescriptorFromSocketIsAvailable()
	{
		if(sockFileDes != null)
			return true;
		else
			try
			{
				sockFileDes = Class.forName("java.net.SocketInputStream");
				return true;
			}
			catch (Exception e)
			{
				return false;
			}
	}

	public static FileDescriptor getFileDescriptorFromSocket(Socket s) throws IOException
	{
		if(sockFileDes == null)
			try
			{
				sockFileDes = Class.forName("java.net.SocketInputStream");
			}
			catch (ClassNotFoundException e)
			{
				e.printStackTrace();
			}
		return ((FileInputStream)sockFileDes.cast(s.getInputStream())).getFD();
	}
	
	public static void setFd(FileDescriptor ofd,int fd)
	{
		try
		{
			fdVal.set(ofd, fd);
		}
		catch(Exception e)
		{
			throw new RuntimeException("Az állományleírók kiolvasása nem lehetséges",e);
		}
	}
}