美文网首页
【Java】java反射基础示例

【Java】java反射基础示例

作者: renkuo | 来源:发表于2017-12-04 19:21 被阅读235次

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

反射某个对象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反射基础示例

    还有很多其它方法,本文只是几个简单的例子 反射某个对象obj的成员变量 反射获取某个对象所有Uri类型的成员变量值...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • 在Alibaba广受喜爱的“Java突击宝典”简直太牛了

    0-1年:夯实基础 1.Java基础(Java异常分类及处理+Java反射+Java注解+Java内部类+Java...

  • java 反射基础

    1.java反射基础 2.java反射进阶 反射的两个显著的作用 反编译: .class —> .java 通过...

  • Java高级知识

    反射 sczyh30 深入解析Java反射(1) - 基础深入解析Java反射(2) - invoke方法深入探究...

  • 安卓反射和动态代理的应用

    提纲 java反射基础 反射在Android中的应用 Java动态代理 动态代理在Android的应用 java反...

网友评论

      本文标题:【Java】java反射基础示例

      本文链接:https://www.haomeiwen.com/subject/nftfixtx.html