【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概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,736评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,159评论 0 62
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,307评论 0 16
  • 一幢老屋,可以装载什么?一段往事,一段童年,一段回忆,还是一段人生历程? 灰色的砖墙,带着斑驳的岁月的旧影;青石砖...
    明暗之间阅读 555评论 0 0