JAVA通过反射加载/设置类型属性
定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
—— [ JAVA反射机制-百度百科 ]
代码块
package com.aol.personalassistant.util;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.util.CollectionUtils;
import com.aol.personalassistant.base.SuperEntity;
/**
* 反射加载类
*/
public class ReflectUtil {
/**
* 获取类型
* @param clazz
* @param index
* @return
* @throws Exception
*/
public static Class<?> getClassType(final Class<?> clazz) throws Exception {
Type genericType = clazz.getGenericSuperclass();
if (!(genericType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genericType).getActualTypeArguments();
if (!(params[0] instanceof Class)) {
return Object.class;
}
return (Class<?>) params[0];
}
/**
* 获取所有属性
* @param clazz
* @return
*/
@SuppressWarnings("unchecked")
public static List<Field> getAllFields(final Class<?> clazz){
Field[] fields = clazz.getDeclaredFields();
Field[] baseFields = getBaseFields();
List<Field> fieldList = new ArrayList<Field>();
fieldList.addAll(CollectionUtils.arrayToList(baseFields));
fieldList.addAll(CollectionUtils.arrayToList(fields));
return fieldList;
}
/**
* 获取属性名
* @param clazz 类
* @return
* @throws Exception
*/
public static List<String> getFieldNames(final Class<?> clazz) throws Exception{
List<String> fieldList = null;
//获取所有的属性名
Field[] fields = clazz.getDeclaredFields();
if(fields != null && fields.length > 0){
fieldList = new ArrayList<String>();
for (Field field : fields) {
fieldList.add(field.getName());
}
}
return fieldList;
}
/**
* 获取所有属性名
* @param clazz 类
* @return
* @throws Exception
*/
public static List<String> getAllFieldNames(final Class<?> clazz) throws Exception{
List<String> fieldList = null;
//获取所有的属性名
List<Field> fields= getAllFields(clazz);
if(fields != null && fields.size() > 0){
fieldList = new ArrayList<String>();
for (Field field : fields) {
fieldList.add(field.getName());
}
}
return fieldList;
}
/**
* 获取基类属性
* @return
*/
@SuppressWarnings("unchecked")
public static List<String> getBaseFieldNames(){
return CollectionUtils.arrayToList(getBaseFields());
}
/**
* 获取基类属性
* @return
*/
public static Field[] getBaseFields(){
return SuperEntity.class.getDeclaredFields();
}
/**
* 获取对象所有的属性值
* @param clazz
* @param obj
* @return
* @throws Exception
*/
public static Map<String,Object> getAllFieldValues(final Class<?> clazz,Object obj) throws Exception{
Map<String,Object> map = null;
//获取所有的属性名
List<Field> fieldList = getAllFields(clazz);
if(fieldList != null && fieldList.size() > 0){
map = new HashMap<String,Object>();
for (Field field : fieldList) {
Object value = null;
if (field.isAccessible()) {
value = field.get(obj);
} else {
field.setAccessible(true);
value = field.get(obj);
field.setAccessible(false);
}
map.put(field.getName(), value);
}
}
return map;
}
/**
* 设置属性值
* @param clazz 目标类
* @param params 参数值(注:params中key值必须为目标类中的属性名,value为属性值。此方法目前仅支持单类属性值设置)
* @return
* @throws Exception
*/
public static Object setFieldValue(final Class<?> clazz,Map<String,Object> params) throws Exception {
Object obj = null;
if(clazz == null) {
throw new Exception("The Operation Error! Cause By: clazz is null");
}
if(params != null) {
Class<?> objClass = getClassType(clazz);
if(objClass == null) {
throw new Exception("Error getting object instance! Cause By: objClass is null");
}
obj = objClass.newInstance();
if(obj != null) {
Set<String> keys = params.keySet();
for (String key : keys) {
String value = (String)params.get(key);
if(value == null) {
continue;
}
Field field = objClass.getDeclaredField(key);
if(field != null) {
field.setAccessible(true);
String fieldType = field.getType().getTypeName();
if("java.lang.Integer".equals(fieldType)) {
field.set(obj, Integer.valueOf(value));
}else if("java.lang.Long".equals(fieldType)) {
field.set(obj, Long.valueOf(value));
}else if("java.lang.Double".equals(fieldType)) {
field.set(obj, Double.valueOf(value));
}else if("java.util.Date".equals(fieldType)) {
field.set(obj, Date.parse(value));
}else {
field.set(obj, value);
}
}
}
}
}
return obj;
}
public static void main(String[] args) throws Exception {
Map<String,Object> map = new HashMap<String,Object>();
map.put("userId", UUIDUtil.getUUID());
map.put("nickName", "张三");
map.put("age",22);
OrgMember member = (OrgMember) setFieldValue(OrgMember.class,map);
System.out.println(member.getUserId());
System.out.println(member.getNickName());
System.out.println(member.getAge());
}
}
注
1、本文纯属个人爱好,仅供参考。
2、有疑问或建议可与我进行交流。 联系我