Android 反射

Java反射

1) 根据一个字符串反射获取一个类的对象

2)反射获取成员变量

3)反射泛型

4)反射进行封装

项目地址:https://github.com/xiongliang120/ReflectProject.git

获取类型:

ClassForName:

Class temp = Class.forName("com.xiongliang.reflectionproject.reflect.Test");

Class属性:

Class temp2 = Test.class;

TYPE属性:

Class temp = Boolean.TYPE

调用构造函数:

Class[] p1 = {int.class};
Constructor c2 = temp.getDeclaredConstructor(p1); 
c2.setAccessible(true);  //private 需要设置权限
Object object2 = c2.newInstance(2);

调用实例方法:

Class[] p1 = {String.class};
Method method = temp.getDeclaredMethod("callPrivateMethod",p1); 
method.setAccessible(true);
Object argList[] = {"test"};
Object result = method.invoke(object,argList);

调用静态实例方法:

Class[] p1 = {String.class};
Method method = temp.getDeclaredMethod("callPrivateStaticMethod",p1);
method.setAccessible(true);
Object argList[] = {"test"};
Object result = method.invoke(null,argList);

获取泛型变量:

public class SingleTon<T> {
    private T mInstance;

    public void setSingleTon(T t){
        mInstance = t;
    }
}
SingleTon singleTon =  new SingleTon();
singleTon.setSingleTon(new Test());

Class<?> instance = Class.forName("com.xiongliang.reflectionproject.reflect.SingleTon");
Field mInstanceFieldId = instance.getDeclaredField("mInstance");
mInstanceFieldId.setAccessible(true);
Object fieldObject = mInstanceFieldId.get(singleTon);

反射封装:

public class ReflectUtil {
    /**
     * 反射构造函数
     * @param className
     * @param paraType
     * @param paraValues
     * @return
     */
    public static Object createObject(String className,Class[] paraType,Object[] paraValues){
        try{
            Class temp = Class.forName(className);
            Constructor c2 = temp.getDeclaredConstructor(paraType);
            c2.setAccessible(true);
            Object object = c2.newInstance(paraValues);
            return object;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 反射调用实例方法
     * @param obj
     * @param methodName
     * @param paraType
     * @param paraValues
     * @return
     */
    public static Object invokeInstanceMethod(Object obj,String methodName,Class[] paraType, Object[] paraValues){
        try{
            if(obj != null){
                Method method = obj.getClass().getDeclaredMethod(methodName,paraType); //在指定类中获取指定的方法
                method.setAccessible(true);
                Object result = method.invoke(obj,paraValues);
                return result;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /***
     * 反射调用静态方法
     * @param className
     * @param methodName
     * @param paramType
     * @param paraValues
     * @return
     */
    public static Object invokeStaticMethod(String className,String methodName,Class[] paramType,Object[] paraValues){
        try{
            Class temp = Class.forName(className);
            Method method = temp.getDeclaredMethod(methodName,paramType);
            method.setAccessible(true);
            Object result = method.invoke(null,paraValues);
            return result;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 反射获取实例字段
     * @param className
     * @param obj
     * @param fieldName
     * @return
     */
    public static Object getFieldObject(String className,Object obj,String fieldName){
        try{
            Class temp = Class.forName(className);
            Field field = temp.getDeclaredField(fieldName);
            field.setAccessible(true);

            Object fieldObject = field.get(obj);
            return fieldObject;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 反射获取静态字段
     * @param className
     * @param fieldName
     * @return
     */
    public static Object getStaticFieldObject(String className,String fieldName){
        return getFieldObject(className,null,fieldName);
    }

    /**
     * 反射设置实例字段值
     * @param className
     * @param obj
     * @param fieldName
     * @param fieldValue
     */
    public static void setFileObject(String className,Object obj,String fieldName,String fieldValue){
        try{
            Class temp = Class.forName(className);
            Field field = temp.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj,fieldValue);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 反射设置静态字段值
     * @param className
     * @param fieldName
     * @param fieldValue
     */
    public static void setStaticFieldObject(String className,String fieldName,String fieldValue){
        setFileObject(className,null,fieldName,fieldValue);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值