java反射的一些工具方法
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.util.Set;
public class ReflectUtil {
private static final Logger log = LoggerFactory.getLogger(ReflectUtil.class);
public static <T> T createNewByKeys(T t1, Set<String> keys){
try {
T t = (T) createByType(t1.getClass());
Object val;
for (String key : keys) {
val = getByName(t1, key);
setByName(t, key, val);
}
return t;
} catch (Exception e) {
log.error("创建新对象异常", e);
}
return null;
}
public static <T> Object getByName(T t, String name) {
if (StringUtils.isEmpty(name)) {
return null;
}
String[] arr = name.split("\\.");
Object obj = t;
for (String s : arr) {
obj = getByAttr(obj, s);
if (obj == null) {
break;
}
}
return obj;
}
public static <T> void setByName(T t, String name, Object val){
if (StringUtils.isEmpty(name)) {
return;
}
String[] arr = name.split("\\.");
Object obj = t;
Object newObj;
Class tClass;
if (arr.length > 1) {
for (int i = 0; i < arr.length - 1; i++) {
newObj = getByAttr(obj, arr[i]);
if (newObj == null) {
tClass = getTypeByName(obj, arr[i]);
if (tClass == null) {
break;
}
newObj = createByType(tClass);
if (newObj == null) {
break;
}
setByAttr(obj, arr[i], newObj);
}
obj = newObj;
}
}
setByAttr(obj, arr[arr.length - 1], val);
}
public static <T> T createByType(Class<T> tClass){
try {
return tClass.newInstance();
} catch (Exception e) {
log.error("根据类型创建对象异常", e);
}
return null;
}
private static <T> void setByAttr(T t, String name, Object value) {
if (t == null || StringUtils.isEmpty(name)) {
return;
}
Field field = null;
try {
field = t.getClass().getDeclaredField(name);
field.setAccessible(true);
field.set(t, value);
} catch (Exception e) {
log.error("反射设置值异常", e);
} finally {
if (field != null) {
field.setAccessible(false);
}
}
}
private static <T> Class getTypeByName(T t, String name){
try {
Field field = t.getClass().getDeclaredField(name);
return field.getType();
} catch (Exception e) {
log.error("获取属性类型异常", e);
}
return null;
}
private static <T> Object getByAttr(T t, String name) {
if (t == null || StringUtils.isEmpty(name)) {
return null;
}
Field field = null;
try {
field = t.getClass().getDeclaredField(name);
field.setAccessible(true);
return field.get(t);
} catch (Exception e) {
log.error("反射获取值异常", e);
} finally {
if (field != null) {
field.setAccessible(false);
}
}
return null;
}
}