java利用reflectasm反射 博客分类: Java reflectasmjava反射
程序员文章站
2024-03-16 12:16:40
...
import java.lang.reflect.Field; import java.util.concurrent.ConcurrentMap; import com.esotericsoftware.reflectasm.MethodAccess; import com.google.common.collect.Maps; public class ReflectUtil { private static final ConcurrentMap<Class<?>, MethodAccess> localCache = Maps.newConcurrentMap(); private ReflectUtil() { } public static String upperFirstChar(String str) { if (str == null || "".equals(str)) { return str; } char[] cs = str.toCharArray(); cs[0] -= 32; return String.valueOf(cs); } public static Object setProperty(Object clazz, String fname, Object fvalue) { if (clazz == null) { throw new IllegalArgumentException("No bean specified"); } if (fname == null) { throw new IllegalArgumentException("No name specified for bean class '" + clazz.getClass() + "'"); } return get(clazz.getClass()).invoke(clazz, "set" + upperFirstChar(fname), fvalue); } public static Object getProperty(Object clazz, String fname) { if (clazz == null) { throw new IllegalArgumentException("No bean specified"); } if (fname == null) { throw new IllegalArgumentException("No name specified for bean class '" + clazz.getClass() + "'"); } return get(clazz.getClass()).invoke(clazz, "get" + upperFirstChar(fname)); } public static MethodAccess get(Class<?> clazz) { if (localCache.containsKey(clazz)) { return localCache.get(clazz); } MethodAccess methodAccess = MethodAccess.get(clazz); localCache.putIfAbsent(clazz, methodAccess); return methodAccess; } public static <F, T> void copyPropertiesIgnoreNull(F from, T to) { copyProperties(from, to, true); } public static <F, T> void copyProperties(F from, T to) { copyProperties(from, to, false); } public static <F, T> void copyProperties(F from, T to, boolean ignoreNull) { MethodAccess fromMethodAccess = get(from.getClass()); MethodAccess toMethodAccess = get(to.getClass()); Field[] fromDeclaredFields = from.getClass().getDeclaredFields(); for (Field field : fromDeclaredFields) { String name = field.getName(); try { Object value = fromMethodAccess.invoke(from, "get" + upperFirstChar(name)); if (ignoreNull && value == null) { continue; } toMethodAccess.invoke(to, "set" + upperFirstChar(name), value); } catch (Exception e) { } } } }