Java 采用反射獲取class屬性值的實(shí)現(xiàn)代碼
更新時間:2013年08月26日 10:16:57 作者:
以下是對在Java中采用反射獲取class屬性值的實(shí)現(xiàn)代碼進(jìn)行了分析介紹,需要的朋友可以過來參考下
原理:Java的反射能夠獲取屬性的名稱,然后通過invoke調(diào)用類的某個方法。
比如有個屬性叫userName,這個類寫了個方法叫g(shù)etUserName,通過invoke調(diào)用getUserName這個方法。
代碼如下
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class ParameterBase
{
/**
* Get Class field and value Map
* @return
*/
public Map<String, String> getClassInfo()
{
Map<String ,String> fieldsAndValues = new HashMap<String, String>();
Field [] fields = this.getClass().getDeclaredFields();
for(int i=0; i< fields.length; i++)
{
Field f = fields[i];
String value = getFieldValue(this ,f.getName()).toString();
fieldsAndValues.put(f.getName(),value);
}
return fieldsAndValues;
}
private String getFieldValue(Object owner, String fieldName)
{
return invokeMethod(owner, fieldName,null).toString();
}
/**
*
* 執(zhí)行某個Field的getField方法
*
* @param owner 類
* @param fieldName 類的屬性名稱
* @param args 參數(shù),默認(rèn)為null
* @return
*/
private Object invokeMethod(Object owner, String fieldName, Object[] args)
{
Class<? extends Object> ownerClass = owner.getClass();
//fieldName -> FieldName
String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
Method method = null;
try
{
method = ownerClass.getMethod("get" + methodName);
}
catch (SecurityException e)
{
//e.printStackTrace();
}
catch (NoSuchMethodException e)
{
// e.printStackTrace();
return "";
}
//invoke getMethod
try
{
return method.invoke(owner);
}
catch (Exception e)
{
return "";
}
}
}
寫一個類User繼承于ParameterBase并寫上一個測試代碼
public class User extends ParameterBase
{
String userName ;
String passWorld;
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getPassWorld()
{
return passWorld;
}
public void setPassWorld(String passWorld)
{
this.passWorld = passWorld;
}
public static void main(String[] args)
{
User u = new User();
u.passWorld = "123";
u.userName = "aaaaa";
System.out.println(u.getClassInfo().toString());
}
}
程序輸出
{passWorld=123, userName=aaaaa}
比如有個屬性叫userName,這個類寫了個方法叫g(shù)etUserName,通過invoke調(diào)用getUserName這個方法。
代碼如下
復(fù)制代碼 代碼如下:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class ParameterBase
{
/**
* Get Class field and value Map
* @return
*/
public Map<String, String> getClassInfo()
{
Map<String ,String> fieldsAndValues = new HashMap<String, String>();
Field [] fields = this.getClass().getDeclaredFields();
for(int i=0; i< fields.length; i++)
{
Field f = fields[i];
String value = getFieldValue(this ,f.getName()).toString();
fieldsAndValues.put(f.getName(),value);
}
return fieldsAndValues;
}
private String getFieldValue(Object owner, String fieldName)
{
return invokeMethod(owner, fieldName,null).toString();
}
/**
*
* 執(zhí)行某個Field的getField方法
*
* @param owner 類
* @param fieldName 類的屬性名稱
* @param args 參數(shù),默認(rèn)為null
* @return
*/
private Object invokeMethod(Object owner, String fieldName, Object[] args)
{
Class<? extends Object> ownerClass = owner.getClass();
//fieldName -> FieldName
String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
Method method = null;
try
{
method = ownerClass.getMethod("get" + methodName);
}
catch (SecurityException e)
{
//e.printStackTrace();
}
catch (NoSuchMethodException e)
{
// e.printStackTrace();
return "";
}
//invoke getMethod
try
{
return method.invoke(owner);
}
catch (Exception e)
{
return "";
}
}
}
寫一個類User繼承于ParameterBase并寫上一個測試代碼
復(fù)制代碼 代碼如下:
public class User extends ParameterBase
{
String userName ;
String passWorld;
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getPassWorld()
{
return passWorld;
}
public void setPassWorld(String passWorld)
{
this.passWorld = passWorld;
}
public static void main(String[] args)
{
User u = new User();
u.passWorld = "123";
u.userName = "aaaaa";
System.out.println(u.getClassInfo().toString());
}
}
程序輸出
復(fù)制代碼 代碼如下:
{passWorld=123, userName=aaaaa}
您可能感興趣的文章:
- Java并發(fā)教程之volatile關(guān)鍵字詳解
- Java多線程 volatile關(guān)鍵字詳解
- Java volatile的適用場景實(shí)例詳解
- Java中的關(guān)鍵字volatile詳解
- Mybatis單個參數(shù)的if判斷報(bào)異常There is no getter for property named ''xxx'' in ''class java.lang.Integer''的解決方案
- Java反射如何有效的修改final屬性值詳解
- Java 用反射設(shè)置對象的屬性值實(shí)例詳解
- Java反射通過Getter方法獲取對象VO的屬性值過程解析
相關(guān)文章
eclipse啟動一個Springboot項(xiàng)目
本文主要介紹了eclipse啟動一個Springboot項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08java實(shí)現(xiàn)fibonacci數(shù)列學(xué)習(xí)示例分享(斐波那契數(shù)列)
這篇文章主要介紹了fibonacci數(shù)列(斐波那契數(shù)列)示例,大家參考使用吧2014-01-01SpringBoot數(shù)據(jù)校驗(yàn)功能的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot數(shù)據(jù)校驗(yàn)功能的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02