Java反射工具类

/**
 * 反射工具类
 */
public class ReflectionUtil
{
    /**
     * 用于访问父类的私有成员
     * @param object
     * @param fieldName
     * @return 对象
     */
    public static Object getFieldValue(Object object, String fieldName)
    {
        try
        {
            final Field field = getNamedField(object.getClass(), fieldName);
            if (field != null)
            {
                AccessController.doPrivileged(new PrivilegedAction<Object>()
                {
                    public Object run()
                    {
                        field.setAccessible(true);
                        return null;
                    }
                });
                return field.get(object);
            }
        }
        catch (Exception e)
        {
            //忽略所有异常
        }
        return null;
    }
    
    /**
     * 通过反射获取静态成员的值
     * @param classVar
     * @param fieldName
     * @return
     * 静态成员的值
     * 
     */
    @SuppressWarnings("unchecked")
    public static Object getFieldValue(Class classVar, String fieldName)
    {
        try
        {
            final Field field = getNamedField(classVar, fieldName);
            if (field != null)
            {
                AccessController.doPrivileged(new PrivilegedAction<Object>()
                {
                    public Object run()
                    {
                        field.setAccessible(true);
                        return null;
                    }
                });
                return field.get(null);
            }
        }
        catch (Exception e)
        {
            //忽略所有异常
        }
        return null;
    }
    
    /**
     * 用于设置私有成员
     * @param object
     * @param fieldName
     * @param value 
     */
    public static void setFieldValue(Object object, String fieldName,
            Object value)
    {
        try
        {
            final Field field = getNamedField(object.getClass(), fieldName);
            if (field != null)
            {
                AccessController.doPrivileged(new PrivilegedAction<Object>()
                {
                    public Object run()
                    {
                        field.setAccessible(true);
                        return null;
                    }
                });
                field.set(object, value);
            }
        }
        catch (Exception e)
        {
            //忽略所有异常
        }
    }
    
    /**
     * 用于设置指定类的私有成员
     * @param object
     * @param clazz 
     * @param fieldName
     * @param value 
     */
    @SuppressWarnings("unchecked")
    public static void setFieldValue(Object object, Class clazz,
            String fieldName, Object value)
    {
        try
        {
            //只在本类中找
            final Field field = clazz.getDeclaredField(fieldName);
            if (field != null)
            {
                AccessController.doPrivileged(new PrivilegedAction<Object>()
                {
                    public Object run()
                    {
                        field.setAccessible(true);
                        return null;
                    }
                });
                field.set(object, value);
            }
        }
        catch (Exception e)
        {
            //忽略所有异常
        }
    }
    
    /**
     * 
     * @param clazz
     * @param fieldName
     * @return
     * 
     * 返回一个类的成员
     */
    @SuppressWarnings("unchecked")
    private static Field getNamedField(Class clazz, String fieldName)
    {
        Field field = null;
        try
        {
            field = clazz.getDeclaredField(fieldName);
        }
        catch (SecurityException e)
        {
            //忽略此异常
        }
        catch (NoSuchFieldException e)
        {
            //本类没有的话,就找父类的
            Class superclass = clazz.getSuperclass();
            if (superclass != null)
            {
                field = getNamedField(superclass, fieldName);
            }
        }
        
        return field;
    }
    
    /**
     * 调用对象的方法
     * @param object
     * @param methodName
     * @param argtypes 
     * @param args
     * @return Object
     */
    @SuppressWarnings("unchecked")
    public static Object invokeMethod(Object object, String methodName,
            Class[] argtypes, Object... args)
    {
        final Method method = getNamedMethod(object.getClass(), methodName, argtypes);
        if (method != null)
        {
            AccessController.doPrivileged(new PrivilegedAction<Object>()
            {
                public Object run()
                {
                    method.setAccessible(true);
                    return null;
                }
            });
            try
            {
                return method.invoke(object, args);
            }
            catch (IllegalArgumentException e)
            {
                e.printStackTrace();
            }
            catch (IllegalAccessException e)
            {
                e.printStackTrace();
            }
            catch (InvocationTargetException e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    @SuppressWarnings("unchecked")
    private static Method getNamedMethod(Class clazz, String methodName,
            Class... args)
    {
        Method method = null;
        try
        {
            method = clazz.getDeclaredMethod(methodName, args);
        }
        catch (SecurityException e)
        {
            //忽略此异常
        }
        catch (NoSuchMethodException e)
        {
            //本类没有的话,就找父类的
            Class superclass = clazz.getSuperclass();
            if (superclass != null)
            {
                method = getNamedMethod(superclass, methodName, args);
            }
        }
        return method;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值