反射帮助ReflectionWraper
来源:互联网 发布:阶乘c语言编程 编辑:程序博客网 时间:2024/06/05 14:55
import android.util.Log;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.HashMap;public class ClassReflectionWraper { private final String TAG = "ClassReflectionWraper"; public Class<?> mClass; private Object mInstance; private boolean mShowInfo = true; /** * 方法集合 */ private HashMap<String, Method> mMethodMap = new HashMap<String, Method>(); /** * 内部类集合 */ private HashMap<String, Class> mInnerClassMap = new HashMap<String, Class>(); /** * 成员变量集合 */ private HashMap<String, Field> mFieldMap = new HashMap<String, Field>(); public ClassReflectionWraper(String className, boolean logInfo){ mShowInfo = logInfo; try { mClass = Class.forName(className); getFieldsInfo(); getConstructors(); getMethodsInfo(); getInnerClassesInfo(); } catch (ClassNotFoundException e) { Log.d(TAG, "class not found:" + className); } } /** * 获取 类的方法 变量 内部类集合 * @param clazz */ public ClassReflectionWraper(Class<?> clazz){ mClass = clazz; getFieldsInfo(); getConstructors(); getMethodsInfo(); getInnerClassesInfo(); } public Object instantiate(Object...objects){ if(objects != null && objects.length > 0){ Class[] paramClasses = new Class[objects.length]; for (int i = 0; i < objects.length; i++) { paramClasses[i] = objects[i].getClass(); } try { Constructor<?> constructor = mClass.getConstructor(paramClasses); mInstance = constructor.newInstance(objects); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } else { try { mInstance = mClass.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return mInstance; } /** * 获取类的所有成员变量 */ private void getFieldsInfo() { Field[] fields = mClass.getDeclaredFields(); for(int i = 0;i < fields.length; i ++){ if (mShowInfo) { Log.d(TAG, "field class name:" + fields[i].toString()); Log.d(TAG, "field name:" + fields[i].getName()); } mFieldMap.put(fields[i].getName(), fields[i]); } } /** * 类的所有的构造方法 */ private void getConstructors() { Constructor[] constructors = mClass.getConstructors(); for(int i = 0;i < constructors.length; i ++){ if(mShowInfo) { Log.d(TAG, "Constructor:" + constructors[i].toString()); } } } /** *获取类的所有函数 */ private void getMethodsInfo() { Method[] methods = mClass.getDeclaredMethods(); for(int i = 0;i < methods.length; i ++){ if (mShowInfo) { Log.d(TAG, "Methods:" + methods[i].toString()); } mMethodMap.put(methods[i].getName(), methods[i]); } } /** * 获取类的所有的内部类 */ private void getInnerClassesInfo() { Class[] classes = mClass.getDeclaredClasses(); for(int i = 0;i < classes.length; i ++){ Log.d(TAG, "Class:" + classes[i].toString()); mInnerClassMap.put(classes[i].getSimpleName(), classes[i]); } } /** * * @param methodName 方法名 * @param target 要调用此方法的对象(或静态方法的null) * @param params 参数 方法的参数 * @return */ public Object invokeMethods(String methodName, Object target, Object ... params){ Log.d(TAG, "invoke method: " + methodName); try { if (mMethodMap.get(methodName) != null) { Method method = mMethodMap.get(methodName); method.setAccessible(true); return method.invoke(target, params); } else { Log.e(TAG, "no such method: " + methodName); } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } return null; } @SuppressWarnings("unchecked") public <T> T getFieldValue(String fieldname, Object instance, T classs){ Field field = mFieldMap.get(fieldname); try { return (T) field.get(instance); } catch (IllegalArgumentException e) { e.printStackTrace(); return null; } catch (IllegalAccessException e) { e.printStackTrace(); return null; } } /** * * @param fieldname 变量名 * @param instance 要调用此变量的对象 * @return */ public Object getFieldValue(String fieldname, Object instance) { Field field = mFieldMap.get(fieldname); try { field.setAccessible(true); return field.get(instance); } catch (IllegalArgumentException e) { e.printStackTrace(); return null; } catch (IllegalAccessException e) { e.printStackTrace(); return null; } } /** * * @param fieldname 变量名 * @param instance 要调用此变量的对象 * @param value 新的值 * @return */ public boolean setFieldValue(String fieldname, Object instance, Object value){ Field field = mFieldMap.get(fieldname); field.setAccessible(true); field.getGenericType(); try { field.set(instance, value); return true; } catch (IllegalArgumentException e) { return false; } catch (IllegalAccessException e) { return false; } } /** * * @param className * @return */ public Class<?> getInnerClass(String className){ return mInnerClassMap.get(className); }}
阅读全文
1 0
- 反射帮助ReflectionWraper
- 反射帮助类ReflectHelper
- android.os.SystemProperties反射帮助类
- 反射帮助类更新2015/11/07
- java反射机制基本用法(附:帮助文档)
- 帮助
- 帮助
- 帮助
- 帮助
- 帮助
- 克服J2SE 1.3 ~ 1.4不兼容问题--从反射API和ANT获得帮助
- 反射机制--调用构造函数和成员方法、制作帮助文档
- Java反射与注解(对学习框架很有帮助)
- 反射
- 反射
- 反射
- 反射
- 反射
- Tinker初探
- websocket范例
- Angular 2 组件之间如何通信
- 数据库
- 稳定排序
- 反射帮助ReflectionWraper
- MongoDB实战-面向文档的数据(找到最合适的数据建模方式)
- 对caffe处理数据过程的浅显理解
- c# get set使用心得
- 根文件系统树的制作及详解
- ios即时通讯客户端开发之-mac上搭建openfire服务器
- 二进制及java反射机制(培训笔记)
- mybatis generator eclipse插件的安装
- SpringBoot的坑-01