package com.arialyy.frame.util; import android.content.Context; import android.content.res.AssetManager; import android.content.res.XmlResourceParser; import android.text.TextUtils; import com.arialyy.frame.util.show.FL; import com.arialyy.frame.util.show.L; import org.xmlpull.v1.XmlPullParser; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import dalvik.system.PathClassLoader; /** * Created by lyy on 2015/7/30. * 反射工具类 */ public class ReflectionUtil { private static final String TAG = "ReflectionUtil"; private static final String ID = "$id"; private static final String LAYOUT = "$layout"; private static final String STYLE = "$style"; private static final String STRING = "$string"; private static final String DRAWABLE = "$drawable"; private static final String ARRAY = "$array"; private static final String COLOR = "color"; private static final String ANIM = "anim"; /** * 从SDcard读取layout * * @return */ public static XmlPullParser getLayoutXmlPullParser(Context context, String filePath, String fileName) { XmlResourceParser paser = null; AssetManager asset = context.getResources().getAssets(); try { Method method = asset.getClass().getMethod("addAssetPath", String.class); int cookie = (Integer) method.invoke(asset, filePath); if (cookie == 0) { FL.e(TAG, "加载路径失败"); } paser = asset.openXmlResourceParser(cookie, fileName + ".xml"); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return paser; } /** * 获取类里面的所在字段 */ public static Field[] getFields(Class clazz) { Field[] fields = null; fields = clazz.getDeclaredFields(); if (fields == null || fields.length == 0) { Class superClazz = clazz.getSuperclass(); if (superClazz != null) { fields = getFields(superClazz); } } return fields; } /** * 获取类里面的指定对象,如果该类没有则从父类查询 */ public static Field getField(Class clazz, String name) { Field field = null; try { field = clazz.getDeclaredField(name); } catch (NoSuchFieldException e) { try { field = clazz.getField(name); } catch (NoSuchFieldException e1) { if (clazz.getSuperclass() == null) { return field; } else { field = getField(clazz.getSuperclass(), name); } } } if (field != null) { field.setAccessible(true); } return field; } /** * 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。 * * @param clazz 目标类 * @param methodName 方法名 * @param params 方法参数类型数组 * @return 方法对象 */ public static Method getMethod(Class clazz, String methodName, final Class<?>... params) { Method method = null; try { method = clazz.getDeclaredMethod(methodName, params); } catch (NoSuchMethodException e) { try { method = clazz.getMethod(methodName, params); } catch (NoSuchMethodException ex) { if (clazz.getSuperclass() == null) { L.e(TAG, "无法找到" + methodName + "方法"); FL.e(TAG, FL.getExceptionString(e)); return method; } else { method = getMethod(clazz.getSuperclass(), methodName, params); } } } if (method != null) { method.setAccessible(true); } return method; } /** * 加载指定的反射类 */ public static Class<?> loadClass(Context context, String ClassName) { String packageName = AndroidUtils.getPackageName(context); String sourcePath = AndroidUtils.getSourcePath(context, packageName); if (!TextUtils.isEmpty(sourcePath)) { PathClassLoader cl = new PathClassLoader(sourcePath, "/data/app/", ClassLoader.getSystemClassLoader()); try { return cl.loadClass(ClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); } } else { FL.e(TAG, "没有【" + sourcePath + "】目录"); } return null; } }