1. 程式人生 > >利用java反射機制一次性呼叫實體類get和set方法,簡化更多程式碼。

利用java反射機制一次性呼叫實體類get和set方法,簡化更多程式碼。

外部呼叫getProperty方法時只需要傳入實體物件即可;例如TestUtil.getProperty(new User());

外部呼叫setProperty方法時只需要傳入實體物件和要set的值即可;例如TestUtil.setProperty(new User(), "setValue");

這裡呼叫setProperty方法後User類中所有欄位的值都將變為"setValue",所以這裡想要給不同的欄位set不同的值,則換一個引數

以下是核心工具類,

package com.qcp.test;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Field;

public class TestUtil {
	/* 該方法用於傳入某例項物件以及物件方法名,通過反射呼叫該物件的某個get方法 */
	public static void getProperty(Object beanObj){
		try {
			Field[] fields = beanObj.getClass().getDeclaredFields();//獲得屬性
			Class clazz = beanObj.getClass();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				// 此處應該判斷beanObj,property不為null
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
				Method getMethod = pd.getReadMethod();
				if (getMethod != null) {
					System.out.println(beanObj+"的欄位是:"+field.getName()+",型別是:"+field.getType()+",取到的值是: "+getMethod.invoke(beanObj)); 
				}
			}
		} catch (IllegalAccessException e) {
			 e.printStackTrace();
		} catch (IllegalArgumentException e) {
			 e.printStackTrace();
		} catch (InvocationTargetException e) {
			 e.printStackTrace();
		} catch (IntrospectionException e) {
			 e.printStackTrace();
		}
	}

	/* 該方法用於傳入某例項物件以及物件方法名、修改值,通過放射呼叫該物件的某個set方法設定修改值 */
	public static void setProperty(Object beanObj,
			Object value){
		try {
			Field[] fields = beanObj.getClass().getDeclaredFields();//獲得屬性
			Class clazz = beanObj.getClass();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				// 此處應該判斷beanObj,property不為null
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), beanObj.getClass());
				Method setMethod = pd.getWriteMethod();
				if (setMethod != null) {
					System.out.println(beanObj+"的欄位是:"+field.getName()+",引數型別是:"+field.getType()+",set的值是: "+value); 
					//這裡注意實體類中set方法中的引數型別,如果不是String型別則進行相對應的轉換
					setMethod.invoke(beanObj, value);//invoke是執行set方法
				}
			}
		} catch (SecurityException e) {
			 e.printStackTrace();
		} catch (IllegalAccessException e) {
			 e.printStackTrace();
		} catch (IllegalArgumentException e) {
			 e.printStackTrace();
		} catch (InvocationTargetException e) {
			 e.printStackTrace();
		} catch (IntrospectionException e) {
			 e.printStackTrace();
		}
	}
}