【JAVA】反射工具类

JAVA反射技术相当好用,制作为工具类后更方便使用,话不多说,上源码:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Java反射工具类<br>
 * 提供以下几个功能:<br>
 * 1. 取最简类名<br>
 * 2. 动态赋值<br>
 * 3. 动态取值<br>
 * 4. 判断是否普通类型(自定义成员变量)<br>
 * 5. 动态取指定类的所有属性名<br>
 * @author nmyy
 * @version 1.0
 */
public class ReflectUtil {

	/**
	 * custom commmon field type 
	 */
	public static String[] commonFieldType = {
			"int", "long", "short", "double", "float", "char", "byte", "boolean", 
			"class java.lang.String", "class java.lang.Integer", "class java.lang.Long", 
			"class java.lang.Short",  "class java.lang.Double",  "class java.lang.Float", 
			"class java.lang.Byte",   "class java.lang.Boolean", "class java.math.BigDecimal"
	};
		
	/**
	 * 获取最简类名(去除包名)<br>
	 * eg : com.csdn.util.ReflectUtil > ReflectUtil
	 * @param className
	 * @return simpleClassName
	 * @author nmyy
	 */
	public static String getSimpleClassName(String className) {
		return className.substring(className.lastIndexOf(".") + 1);
	}
	
	/**
	 * 为指定对象的指定属性动态赋予指定值
	 * @param obj 指定对象
	 * @param fieldName 指定属性
	 * @param value 指定值
	 * @return obj
	 * @author nmyy
	 */
	public static Object dynamicSetValue(Object obj, String fieldName, Object value) {
		try {
			String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 取属性首字母转大写
			String setMethodName = "set" + firstLetter + fieldName.substring(1); // set方法名
			Field field = obj.getClass().getDeclaredField(fieldName); // 获取属性
			Method setMethod = obj.getClass().getDeclaredMethod(setMethodName, field.getType()); // 获取set方法
			setMethod.invoke(obj, value); // 通过set方法动态赋值
			// obj.getClass().getDeclaredField(fieldName).set(obj, value) 为直接对指定public属性赋值,不实用
		} catch (Exception e) {
			e.printStackTrace();
		}
		return obj;
	}
	
	/**
	 * 动态获取指定对象指定属性的值
	 * @param obj 指定对象
	 * @param fieldName 指定属性
	 * @return 属性值
	 * @author nmyy
	 */
	public static Object dynamicGetValue(Object obj, String fieldName) {
		Object value = null;
		try {
			//if ( isCommonTypeField(obj, fieldName) ) { // 限普通类型
				String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 取属性首字母转大写
				String getMethodName = "get" + firstLetter + fieldName.substring(1); // get方法名
				Method getMethod = obj.getClass().getDeclaredMethod(getMethodName); // 获取get方法
				value = getMethod.invoke(obj); // 动态取值
			//}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return value;
	}
	
	/**
	 * 判断指定对象中的指定属性名的类型是否属于自定义普通数据类型
	 * @param obj 指定对象
	 * @param fieldName 指定属性名
	 * @return
	 * @author nmyy
	 */
	public static boolean isCommonTypeField(Object obj, String fieldName) {
		boolean result = false;
		try {
			Field field = obj.getClass().getDeclaredField(fieldName);
			String type = field.getGenericType().toString();
			for ( int i = 0; i < commonFieldType.length; i++ ) {
				if ( commonFieldType[i].equals(type) ) {
					result = true;
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 获取指定类的所有属性名
	 * @param className 指定类全名
	 * @return 所有属性名
	 * @author nmyy
	 */
	public static String[] getAllFieldName(String className) {
		String[] fieldName = null;
		try {
			Field[] fields = Class.forName(className).getDeclaredFields();
			fieldName = new String[fields.length];
			for ( int i = 0; i < fields.length; i++ ) {
				fieldName[i] = fields[i].getName();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fieldName;
	}
	
}



End .


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值