美文网首页
【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反射基础示例

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