|

场景:
从依赖工程里访问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();
}
}
|