Java通過PropertyDescriptor反射調(diào)用set和get方法
本文實(shí)例為大家分享了PropertyDescriptor反射調(diào)用set和get方法,供大家參考,具體內(nèi)容如下
第一段:
package com.zhoushun;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.beans.PropertyDescriptor;
public class PropertyUtil {
@SuppressWarnings("unchecked")
public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName) {
StringBuffer sb = new StringBuffer();//構(gòu)建一個可變字符串用來構(gòu)建方法名稱
Method setMethod = null;
Method getMethod = null;
PropertyDescriptor pd = null;
try {
Field f = clazz.getDeclaredField(propertyName);//根據(jù)字段名來獲取字段
if (f!= null) {
//構(gòu)建方法的后綴
String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
sb.append("set" + methodEnd);//構(gòu)建set方法
setMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ f.getType() });
sb.delete(0, sb.length());//清空整個可變字符串
sb.append("get" + methodEnd);//構(gòu)建get方法
//構(gòu)建get 方法
getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ });
//構(gòu)建一個屬性描述器 把對應(yīng)屬性 propertyName 的 get 和 set 方法保存到屬性描述器中
pd = new PropertyDescriptor(propertyName, getMethod, setMethod);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return pd;
}
@SuppressWarnings("unchecked")
public static void setProperty(Object obj,String propertyName,Object value){
Class clazz = obj.getClass();//獲取對象的類型
PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//獲取 clazz 類型中的 propertyName 的屬性描述器
Method setMethod = pd.getWriteMethod();//從屬性描述器中獲取 set 方法
try {
setMethod.invoke(obj, new Object[]{value});//調(diào)用 set 方法將傳入的value值保存屬性中去
}catch (Exception e){
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static Object getProperty(Object obj, String propertyName){
Class clazz = obj.getClass();//獲取對象的類型
PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//獲取 clazz 類型中的 propertyName 的屬性描述器
Method getMethod = pd.getReadMethod();//從屬性描述器中獲取 get 方法
Object value =null ;
try {
value = getMethod.invoke(clazz, new Object[]{});//調(diào)用方法獲取方法的返回值
} catch (Exception e) {
e.printStackTrace();
}
return value;//返回值
}
}
第二段:
public boolean setValue(Object objSet, Object objGet)
throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, IntrospectionException
{
boolean flag = true;
Field fields[] = objSet.getClass().getDeclaredFields();
String value = "";
String fieldNameGet = "";
List list = new ArrayList();
Field afield[];
int j = (afield = fields).length;
for(int i = 0; i < j; i++)
{
Field field = afield[i];
String fieldName = field.getName();
fieldNameGet = xmlToModel(fieldName);
if(!"error".equals(fieldNameGet))
{
PropertyDescriptor pd = new PropertyDescriptor(fieldNameGet, objGet.getClass());
Method getMethod = pd.getReadMethod();
value = String.valueOf(getMethod.invoke(objGet, new Object[0]));
boolean checkResult = returnMessage.checkValue(value, fieldNameGet);
if(checkResult)
{
PropertyDescriptor pd1 = new PropertyDescriptor(fieldName, objSet.getClass());
Method setMethod = pd1.getWriteMethod();
setMethod.invoke(objSet, new Object[] {
field.getType().getConstructor(new Class[] {
java/lang/String
}).newInstance(new Object[] {
value
})
});
} else
{
flag = checkResult;
}
}
}
return flag;
}
第三段:
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("TaskProvidePropsList");//這里的類名是全名。。有包的話要加上包名
Object obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
//寫數(shù)據(jù)
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method wM = pd.getWriteMethod();//獲得寫方法
wM.invoke(obj, 2);//因為知道是int類型的屬性,所以傳個int過去就是了。。實(shí)際情況中需要判斷下他的參數(shù)類型
}
//讀數(shù)據(jù)
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method rM = pd.getReadMethod();//獲得讀方法
Integer num = (Integer) rM.invoke(obj);//因為知道是int類型的屬性,所以轉(zhuǎn)換成integer就是了。。也可以不轉(zhuǎn)換直接打印
System.out.println(num);
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java如何加載外部Jar的類并通過反射調(diào)用類的方法
- java反射調(diào)用方法NoSuchMethodException的解決方案
- java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案
- Java 使用反射調(diào)用jar包中的類方式
- Java使用反射調(diào)用方法示例
- java中利用反射調(diào)用另一類的private方法的簡單實(shí)例
- Java 反射調(diào)用靜態(tài)方法的簡單實(shí)例
- 反射調(diào)用private方法實(shí)踐(php、java)
- java反射調(diào)用get/set方法實(shí)現(xiàn)
相關(guān)文章
java線程并發(fā)blockingqueue類使用示例
BlockingQueue是一種特殊的Queue,若BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進(jìn)入等待狀態(tài)直到BlocingkQueue進(jìn)了新貨才會被喚醒,下面是用BlockingQueue來實(shí)現(xiàn)Producer和Consumer的例子2014-01-01
解決Java變異出現(xiàn)錯誤No enclosing instance of type XXX is accessible
這牌你文章主要給大家分享解決Java變異出現(xiàn)錯誤,具體的饑餓絕方案請看下面文章的內(nèi)容,需要的朋友可以參考一下,希望能幫助到你2021-09-09
Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊
這篇文章主要介紹了Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
深入淺析Netty 在 Dubbo 中是如何應(yīng)用的
國內(nèi)知名框架 Dubbo 底層使用的是 Netty 作為網(wǎng)絡(luò)通信,那么內(nèi)部到底是如何使用的呢?今天通過本文給大家詳細(xì)講解,對Netty 在 Dubbo中應(yīng)用相關(guān)知識感興趣的朋友跟隨小編一起看看吧2020-05-05
Spring MVC 404 Not Found無錯誤日志的解決方法
這篇文章主要為大家詳細(xì)介紹了Spring MVC 404 Not Found無錯誤日志的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Spring中的@CrossOrigin注解的使用詳細(xì)解讀
這篇文章主要介紹了Spring中的@CrossOrigin注解的使用詳細(xì)解讀,跨源資源共享(CORS),是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,允許對跨域請求進(jìn)行靈活授權(quán),用來代替IFRAME或JSONP等非正規(guī)實(shí)現(xiàn)方式,需要的朋友可以參考下2023-11-11
Java中String字符串轉(zhuǎn)具體對象的幾種常用方式
String對象可以用來存儲任何字符串類型的數(shù)據(jù),包括HTML、XML等格式的字符串,下面這篇文章主要給大家介紹了關(guān)于JavaString字符串轉(zhuǎn)具體對象的幾種常用方式,需要的朋友可以參考下2024-03-03
feign調(diào)用中文參數(shù)被encode編譯的問題
這篇文章主要介紹了feign調(diào)用中文參數(shù)被encode編譯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

