package com.github.ompc.greys.core.util; import java.lang.reflect.*; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; /** * 反射工具类 Created by oldmanpushcart@gmail.com on 15/5/18. */ public class GaReflectUtils { /** * 获取对象某个成员的值 * * @param <T> T * @param target 目标对象 * @param field 目标属性 * @return 目标属性值 * @throws IllegalArgumentException 非法参数 * @throws IllegalAccessException 非法进入 */ public static <T> T getValue(Object target, Field field) throws IllegalArgumentException, IllegalAccessException { final boolean isAccessible = field.isAccessible(); try { field.setAccessible(true); //noinspection unchecked return (T) field.get(target); } finally { field.setAccessible(isAccessible); } } /** * 设置对象某个成员的值 * * @param field 属性对象 * @param value 属性值 * @param target 目标对象 * @throws IllegalArgumentException 非法参数 * @throws IllegalAccessException 非法进入 */ public static void setValue(Field field, Object value, Object target) throws IllegalArgumentException, IllegalAccessException { final boolean isAccessible = field.isAccessible(); try { field.setAccessible(true); field.set(target, value); } finally { field.setAccessible(isAccessible); } } /** * 获取一个类下的所有成员(包括父类、私有成员) * * @param clazz 目标类 * @return 类下所有属性 */ public static Set<Field> getFields(Class<?> clazz) { final Set<Field> fields = new LinkedHashSet<Field>(); final Class<?> parentClazz = clazz.getSuperclass(); Collections.addAll(fields, clazz.getDeclaredFields()); if (null != parentClazz) { fields.addAll(getFields(parentClazz)); } return fields; } /** * 获取一个类下的指定成员 * * @param clazz 目标类 * @param name 属性名 * @return 属性 */ public static Field getField(Class<?> clazz, String name) { for (Field field : getFields(clazz)) { if (GaCheckUtils.isEquals(field.getName(), name)) { return field; } }//for return null; } /** * 将字符串转换为指定类型,目前只支持9种类型:8种基本类型(包括其包装类)以及字符串 * * @param t 目标对象类型 * @param value 目标值 * @return 类型转换后的值 */ @SuppressWarnings("unchecked") public static <T> T valueOf(Class<T> t, String value) { if (GaCheckUtils.isIn(t, int.class, Integer.class)) { return (T) Integer.valueOf(value); } else if (GaCheckUtils.isIn(t, long.class, Long.class)) { return (T) Long.valueOf(value); } else if (GaCheckUtils.isIn(t, double.class, Double.class)) { return (T) Double.valueOf(value); } else if (GaCheckUtils.isIn(t, float.class, Float.class)) { return (T) Float.valueOf(value); } else if (GaCheckUtils.isIn(t, char.class, Character.class)) { return (T) Character.valueOf(value.charAt(0)); } else if (GaCheckUtils.isIn(t, byte.class, Byte.class)) { return (T) Byte.valueOf(value); } else if (GaCheckUtils.isIn(t, boolean.class, Boolean.class)) { return (T) Boolean.valueOf(value); } else if (GaCheckUtils.isIn(t, short.class, Short.class)) { return (T) Short.valueOf(value); } else if (GaCheckUtils.isIn(t, String.class)) { return (T) value; } else { return null; } } /** * 定义类 * * @param targetClassLoader 目标classLoader * @param className 类名称 * @param classByteArray 类字节码数组 * @return 定义的类 * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */ public static Class<?> defineClass( final ClassLoader targetClassLoader, final String className, final byte[] classByteArray) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { final Method defineClassMethod = ClassLoader.class.getDeclaredMethod( "defineClass", String.class, byte[].class, int.class, int.class ); synchronized (defineClassMethod) { final boolean acc = defineClassMethod.isAccessible(); try { defineClassMethod.setAccessible(true); return (Class<?>) defineClassMethod.invoke( targetClassLoader, className, classByteArray, 0, classByteArray.length ); } finally { defineClassMethod.setAccessible(acc); } } } // /** // * 获取目标类的ClassLoader<br/> // * 因为JVM的ClassLoader采用双亲委派,所以按层次排序 // * // * @param targetClass 目标类 // * @return ClassLoader层次列表(按层次排序,从近到远) // */ // public static ArrayList<ClassLoader> recGetClassLoader(final Class<?> targetClass) { // final ArrayList<ClassLoader> classLoaderList = new ArrayList<ClassLoader>(); // ClassLoader loader = targetClass.getClassLoader(); // if (null != loader) { // classLoaderList.add(loader); // while (true) { // loader = loader.getParent(); // if (null == loader) { // break; // } // classLoaderList.add(loader); // } // } // return classLoaderList; // } /** * 获取目标类的父类 * 因为Java的类继承关系是单父类的,所以按照层次排序 * * @param targetClass 目标类 * @return 目标类的父类列表(顺序按照类继承顺序倒序) */ public static ArrayList<Class<?>> recGetSuperClass(Class<?> targetClass) { final ArrayList<Class<?>> superClassList = new ArrayList<Class<?>>(); Class<?> currentClass = targetClass; do { final Class<?> superClass = currentClass.getSuperclass(); if (null == superClass) { break; } superClassList.add(currentClass = superClass); } while (true); return superClassList; } /** * 计算ClassType * * @param targetClass 目标类 * @return 计算出的ClassType */ public static int computeClassType(Class<?> targetClass) { int type = 0; if (targetClass.isAnnotation()) type |= TYPE_ANNOTATION; if (targetClass.isAnonymousClass()) type |= TYPE_ANONYMOUS; if (targetClass.isArray()) type |= TYPE_ARRAY; if (targetClass.isEnum()) type |= TYPE_ENUM; if (targetClass.isInterface()) type |= TYPE_INTERFACE; if (targetClass.isLocalClass()) type |= TYPE_LOCAL; if (targetClass.isMemberClass()) type |= TYPE_MEMBER; if (targetClass.isPrimitive()) type |= TYPE_PRIMITIVE; if (targetClass.isSynthetic()) type |= TYPE_SYNTHETIC; return type; } public static final int TYPE_ANNOTATION = 1 << 0; public static final int TYPE_ANONYMOUS = 1 << 1; public static final int TYPE_ARRAY = 1 << 2; public static final int TYPE_ENUM = 1 << 3; public static final int TYPE_INTERFACE = 1 << 4; public static final int TYPE_LOCAL = 1 << 5; public static final int TYPE_MEMBER = 1 << 6; public static final int TYPE_PRIMITIVE = 1 << 7; public static final int TYPE_SYNTHETIC = 1 << 8; /** * 默认类型(全匹配) */ public static final int DEFAULT_TYPE = TYPE_ANNOTATION | TYPE_ANONYMOUS | TYPE_ARRAY | TYPE_ENUM | TYPE_INTERFACE | TYPE_LOCAL | TYPE_MEMBER | TYPE_PRIMITIVE | TYPE_SYNTHETIC; /** * 计算类修饰符 * * @param targetClass 目标类 * @return 类修饰符 */ public static int computeModifier(final Class<?> targetClass) { return targetClass.getModifiers(); } public static int computeModifier(final Method targetMethod) { return targetMethod.getModifiers(); } public static int computeModifier(final Constructor<?> targetConstructor) { return targetConstructor.getModifiers(); } public static int computeModifier(final Field targetField) { return targetField.getModifiers(); } public static final int MOD_PUBLIC = Modifier.PUBLIC; public static final int MOD_PRIVATE = Modifier.PRIVATE; public static final int MOD_PROTECTED = Modifier.PROTECTED; public static final int MOD_STATIC = Modifier.STATIC; public static final int MOD_FINAL = Modifier.FINAL; public static final int MOD_SYNCHRONIZED = Modifier.SYNCHRONIZED; public static final int MOD_VOLATILE = Modifier.VOLATILE; public static final int MOD_TRANSIENT = Modifier.TRANSIENT; public static final int MOD_NATIVE = Modifier.NATIVE; public static final int MOD_ABSTRACT = Modifier.ABSTRACT; public static final int MOD_STRICT = Modifier.STRICT; /** * 默认匹配修饰符(全匹配) */ public static final int DEFAULT_MOD = MOD_FINAL | MOD_PROTECTED | MOD_VOLATILE | MOD_STATIC | MOD_PUBLIC | MOD_SYNCHRONIZED | MOD_TRANSIENT | MOD_ABSTRACT | MOD_NATIVE | MOD_STRICT | MOD_PRIVATE; }