android 反射方法属性的传值

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 15:07   11   0

干

场景:

从依赖工程里访问APP项目代码中的类、方法、属性、传递值

警告:下面的代码块会有一部分weex扩展用的格式代码,只需要关注核心代码即可!

1、android 依赖项目 跳转到APP项目下的类:

 利用包名反射获取类:
 
  Intent intent=new Intent();
  try {
   Class updateClass = Class.forName("com.xxx.xxx.UI.activity.myActivity.UpdataCentertifiActivity");
   intent.setClassName(context, updateClass.getName());
   context.startActivity(intent);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }

2、android 依赖项目,反射App类下的方法:

 @JSMethod(uiThread = true)
    public void checkAuthState(){
        Activity context = (Activity) mWXSDKInstance.getContext();
        try {
   //反射找到对应的类
            Class authClass = Class.forName("com.xxx.xxx.Util.AliRealAuthenticatUtil");

            //获取AliRealAuthenticatUtil实例
            Method methodGetInstance = authClass.getMethod("getInstance");
            Object instanceObj = methodGetInstance.invoke(null);

            //获取所有方法中的 realAuthent 方法执行
            Method[] methods = authClass.getMethods();
            for (Method method : methods){
                if(method.getName().equals("realAuthent")){
                    method.invoke(instanceObj,context,null);// 参数(对应类的实例、参数context、参数null)
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3、android 依赖项目,反射App类下的属性和值:

 Class constantsConfigClass = Class.forName("com.xxx.xxx.constant.ConstantsConfig");
 Field field = constantsConfigClass.getDeclaredField("UP_CERTIFICATE");
 String typeField = "upCertivicate";//设个默认值,实际按照属性field去获取
 String typeName = (String)field.get(typeField);

4、android 依赖项目,intent跳转传递反射的数据:

/**
     * 跳转到添加证书的页面
     */
    @JSMethod(uiThread = true)
    public void intent2UpdateCertificateActivity(Map<String,Object> certificateDetail){
        Activity context = (Activity) mWXSDKInstance.getContext();
        Intent intent=new Intent();
        try {
            Class updateClass = Class.forName("com.xxx.xxx.UI.activity.myActivity.UpdataCentertifiActivity");
            if(certificateDetail!=null){
                //用作获取Config类里的key
                Class constantsConfigClass = Class.forName("com.xxx.xxx.constant.ConstantsConfig");
                //获取Config中的这个属性的值作为key
                Field field = constantsConfigClass.getDeclaredField("UP_CERTIFICATE");
                //设个默认值,实际按照属性field去获取
                String typeField = "upCertivicate";
                //Intent.putExtra的key
                String typeName = (String)field.get(typeField);

                //数据bean的类
                Class certificateInfoClass = Class.forName("com.xxx.xxx.pojo.CertificateInfo");
                Object object = null;
                try {
                    //通过反射,把当前的Map对象certificateDetail的所有属性,转成CertificateInfo数据bean
                    object = certificateInfoClass.newInstance();
                    //获取CertificateInfo数据bean的所有属性
                    Field[] fields = certificateInfoClass.getDeclaredFields();
                    for (Field fieldItem : fields) {
                        String fieldName = fieldItem.getName();
                        if (certificateDetail.get(fieldName) == null)
                            continue;
                        String firstC = fieldName.substring(0, 1);
                        //处理bean的属性方法名称,比如setName
                        String resultName = "set" + fieldName.replaceFirst(firstC, firstC.toUpperCase());
                        //反射获取setName方法
                        Method method = certificateInfoClass.getMethod(resultName,fieldItem.getType());
                        if (resultName.equals(method.getName())) {
                            if(fieldName.equals("photos")){
                                Class cl =fieldItem.getType();//class java.util.ArrayList 可以用作判断属性值是什么类型
                                JSONArray photos = (JSONArray)certificateDetail.get(fieldName);
                                List<String> photosList = new ArrayList<>();
                                for(int index = 0; index < photos.size(); index++){
                                    photosList.add(photos.get(index).toString());
                                }
                                //反射调用方法并传递参数
                                method.invoke(object, photosList);
                            }else{
                                //反射调用方法并传递参数
                                method.invoke(object, certificateDetail.get(fieldName));
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //intent传递参数
                intent.putExtra(typeName,(Serializable) object);
            }
            intent.setClassName(context, updateClass.getName());
            context.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP