【Java】java反射基础示例

还有很多其它方法,本文只是几个简单的例子

反射某个对象obj的成员变量
Class sessionParamsClass = obj.getClass();
Field appPackageNameField = sessionParamsClass.getDeclaredField("fieldName");
appPackageNameField.setAccessible(true);
String appPackageName = (String) appPackageNameField.get(obj);(静态字段可以field.get(null))
反射获取某个对象所有Uri类型的成员变量值
PackageInstaller.SessionParams sessionParams = (PackageInstaller.SessionParams) param.args[0];
Class sessionParamsClass = sessionParams.getClass();
Log.e("packageHook",sessionParamsClass.getName());
Field[] declaredFields = sessionParamsClass.getDeclaredFields();
for (Field field : declaredFields){
    field.setAccessible(true);
    if (field.getType() == Uri.class){
        Uri uri = (Uri) field.get(sessionParams);
        if (uri != null){
            if (uri.getPath() != null){
                Log.e("packageHook",field.getName() + "_path_" + uri.getPath());
            }
        }else {
            Log.e("packageHook","Uri null");
        }
    }
}
反射构造一个类的对象
private Object getPackageManagerException(ClassLoader classloader) throws Exception {

    Class pme = Class.forName(PACKAGE_MANAGER_Exception_CLASS, false, classLoader);

    // 首先准备一个Class[]做为ctor的参数类型(本例指定为一个int和一个string),
    Class[] pType = new Class[] {int.class, String.class};

    // 调用pType为变量的getConstructor(),获得一个专属ctor
    Constructor ctor = pme.getDeclaredConstructor(pType);

    // 准备一个Object[] 做为ctor实参值
    Object[] obj = new Object[]{INSTALL_FAILED_INTERNAL_ERROR, "can not install"};

    // 调用上述专属ctor的newInstance()
    Object result = ctor.newInstance(obj);


    return result;
}
反射执行方法
/**
 * 执行方法
 * @param obj 执行方法的对象
 * @param methodName 方法名称
 * @param classes 执行方法的参数类型
 * @param args 执行方法的参数
 */
public void invokeMethod(Object obj, String methodName, Class[] classes, Object... args){
    try {
        Method method;
        if (classes != null && classes.length > 0){
            method = obj.getClass().getDeclaredMethod(methodName,classes);
        }else {
            method = obj.getClass().getDeclaredMethod(methodName);
        }
        method.setAccessible(true);
        method.invoke(obj, args);//反射执行静态方法method.invoke(null, args)只需要将invoke方法的第一个参数设为null即可!
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
(备注)classtype:boolean.class / int.class / List.class /
反射更改变量的值
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
    fields[i].setAccessible(true);
    Log.e("aaaa",fields[i].getName());
    if (fields[i].getName().equals("codeFile")) {
        fields[i].set(obj, new File("i don't want to install"));
    }
}

错误不足之处或相关建议欢迎大家评论指出,谢谢!如果觉得内容可以的话麻烦喜欢(♥)一下

你可能感兴趣的:(【Java】java反射基础示例)