package com.qianfandu.utils; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射相关的工具类 * * @author linchaolong * */ public class Reflect { public static Object invokeStaticMethod(String class_name, String method_name, Class[] pareTyple, Object[] pareVaules){ try { Class obj_class = Class.forName(class_name); Method method = obj_class.getMethod(method_name,pareTyple); return method.invoke(null, pareVaules); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } /** * 调用类或对象的方法并返回结果 * * @param clazz 类 * @param methodName 方法名 * @param obj 调用该方法的对象,如果是静态方法则传null * @param args 参数,如果没有则传null * @param parameterTypes 方法参数类型的class,如果没有则传null * @return 调用结果 */ public static Object invokeMethod(Class<?> clazz, Object obj, String methodName, Object[] args,Class<?>... parameterTypes){ try { // 反射类指定方法 Method method = clazz.getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); // 暴力反射 // 调用方法并返回结果 return method.invoke(obj, args); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } return null; } /** * 调用类或对象的方法并返回结果 * * @param className 类名 * @param methodName 方法名 * @param obj 调用该方法的对象,如果是静态方法则传null * @param args 参数,如果没有则传null * @param parameterTypes 方法参数类型的class,如果没有则传null * @return 调用结果 */ public static Object invokeMethod(String className, Object obj, String methodName, Object[] args,Class<?>... parameterTypes){ try { // 防止空指针错误 if (parameterTypes == null) { parameterTypes = new Class[0]; } if (args == null) { args = new Object[0]; } // 加载类的字节码 Class<?> clazz = Class.forName(className); return invokeMethod(clazz, obj, methodName, args, parameterTypes); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } public static Object invokeMethod(String class_name, String method_name, Object obj ,Class[] pareTyple, Object[] pareVaules){ try { Class obj_class = Class.forName(class_name); Method method = obj_class.getMethod(method_name,pareTyple); return method.invoke(obj, pareVaules); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } /** * 获取对象或类某个字段的值 * * @param clazz 类 * @param obj 对象,如果是静态字段则传null * @param fieldName 字段名称 * @return 字段的值 */ public static Object getFieldValue(Class<?> clazz, Object obj, String fieldName){ try { Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); return field.get(obj); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } return null; } /** * 设置类的属性(包括私有和保护) * @param classname * @param filedName * @param obj * @param filedVaule */ public static void setFieldOjbect(String classname, String filedName, Object obj, Object filedVaule){ try { Class obj_class = Class.forName(classname); Field field = obj_class.getDeclaredField(filedName); field.setAccessible(true); field.set(obj, filedVaule); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 反射得到类的属性(包括私有和保护) * @param class_name * @param obj * @param filedName * @return */ public static Object getFieldOjbect(String class_name,Object obj, String filedName){ try { Class obj_class = Class.forName(class_name); Field field = obj_class.getDeclaredField(filedName); field.setAccessible(true); return field.get(obj); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 获取对象或类某个字段的值 * * @param className 类名 * @param obj 对象,如果是静态字段则传null * @param fieldName 字段名称 * @return 字段的值 */ public static Object getFieldValue(String className, Object obj, String fieldName){ try { Class<?> clazz = Class.forName(className); return getFieldValue(clazz, obj, fieldName); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } return null; } /** * 设置对象或类某个字段的值 * * @param clazz 类 * @param obj 对象,如果是静态字段则传null * @param fieldName 字段名称 * @param value 字段值 * @return 是否设置成功 */ public static boolean setFieldValue(Class<?> clazz, Object obj, String fieldName, Object value){ try { Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); field.set(obj, value); return true; } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } return false; } /** * 设置对象或类某个字段的值 * * @param className 类名 * @param obj 对象,如果是静态字段则传null * @param fieldName 字段名称 * @param value 字段值 * @return 是否设置成功 */ public static boolean setFieldValue(String className, Object obj, String fieldName, Object value){ try { Class<?> clazz = Class.forName(className); setFieldValue(clazz, obj, fieldName, value); return true; } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (IllegalArgumentException e) { e.printStackTrace(); } return false; } /** * 根据类名实例化一个对象 * * @param className 类名 * @return 对象实例,如果实例化失败返回null */ public static Object newInstance(String className){ try { Class<?> clazz = Class.forName(className); return clazz.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } }