package test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import everyDay.Person;
/**
* Created by lightClouds917
* Date 2017/12/29
* Description:根據(jù)屬性名反射獲取get和set方法
*/
public class TestReflect3 {
public static void main(String[] args)throws Exception{
//test removeLine
System.out.println(removeLine("abg_dwr"));
System.out.println(removeLine("ab_wr"));
System.out.println(removeLine("abgwr"));
System.out.println(removeLine(null));
//test get
Person person1 = new Person();
person1.setAge(11);
person1.setName("旺旺");
Object ob = getGetMethod(person1, "name");
System.out.println(ob);
//test set
Person person2 = new Person();
String field2 = "name";
setValue(person2, person2.getClass(), field2, Person.class.getDeclaredField(field2).getType(), "汪汪");
System.out.println(person2);
//獲取某個屬性的類型
System.out.println(Person.class.getDeclaredField("age").getType());
}
/**
* 根據(jù)屬性渊胸,獲取get方法
* @param ob 對象
* @param name 屬性名
* @return
* @throws Exception
*/
public static Object getGetMethod(Object ob , String name)throws Exception{
Method[] m = ob.getClass().getMethods();
for(int i = 0;i < m.length;i++){
if(("get"+name).toLowerCase().equals(m[i].getName().toLowerCase())){
return m[i].invoke(ob);
}
}
return null;
}
/**
* 根據(jù)屬性旬盯,拿到set方法,并把值set到對象中
* @param obj 對象
* @param clazz 對象的class
* @param fileName 需要設(shè)置值得屬性
* @param typeClass
* @param value
*/
public static void setValue(Object obj,Class<?> clazz,String filedName,Class<?> typeClass,Object value){
filedName = removeLine(filedName);
String methodName = "set" + filedName.substring(0,1).toUpperCase()+filedName.substring(1);
try{
Method method = clazz.getDeclaredMethod(methodName, new Class[]{typeClass});
method.invoke(obj, new Object[]{getClassTypeValue(typeClass, value)});
}catch(Exception ex){
ex.printStackTrace();
}
}
/**
* 通過class類型獲取獲取對應(yīng)類型的值
* @param typeClass class類型
* @param value 值
* @return Object
*/
private static Object getClassTypeValue(Class<?> typeClass, Object value){
if(typeClass == int.class || value instanceof Integer){
if(null == value){
return 0;
}
return value;
}else if(typeClass == short.class){
if(null == value){
return 0;
}
return value;
}else if(typeClass == byte.class){
if(null == value){
return 0;
}
return value;
}else if(typeClass == double.class){
if(null == value){
return 0;
}
return value;
}else if(typeClass == long.class){
if(null == value){
return 0;
}
return value;
}else if(typeClass == String.class){
if(null == value){
return "";
}
return value;
}else if(typeClass == boolean.class){
if(null == value){
return true;
}
return value;
}else if(typeClass == BigDecimal.class){
if(null == value){
return new BigDecimal(0);
}
return new BigDecimal(value+"");
}else {
return typeClass.cast(value);
}
}
/**
* 處理字符串 如: abc_dex ---> abcDex
* @param str
* @return
*/
public static String removeLine(String str){
if(null != str && str.contains("_")){
int i = str.indexOf("_");
char ch = str.charAt(i+1);
char newCh = (ch+"").substring(0, 1).toUpperCase().toCharArray()[0];
String newStr = str.replace(str.charAt(i+1), newCh);
String newStr2 = newStr.replace("_", "");
return newStr2;
}
return str;
}
}
Java---通過屬性名反射獲取get和set方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門而克,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怔毛,“玉大人员萍,你說我怎么就攤上這事〖鸲龋” “怎么了碎绎?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長抗果。 經(jīng)常有香客問我筋帖,道長,這世上最難降的妖魔是什么冤馏? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上背率,老公的妹妹穿的比我還像新娘。我一直安慰自己墩划,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布嗡综。 她就那樣靜靜地躺著乙帮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪极景。 梳的紋絲不亂的頭發(fā)上察净,一...
- 文/蒼蘭香墨 我猛地睜開眼喜庞,長吁一口氣:“原來是場噩夢啊……” “哼诀浪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起延都,我...
- 正文 年R本政府宣布,位于F島的核電站党窜,受9級特大地震影響拗引,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幌衣,卻給世界環(huán)境...
- 文/蒙蒙 一矾削、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦怔软、人聲如沸垦细。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽括改。三九已至,卻和暖如春家坎,著一層夾襖步出監(jiān)牢的瞬間嘱能,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 介紹 在java中著拭,利用反射的時候,有時候會傳過去屬性的名稱字符串牍帚,然后根據(jù)字符串來獲取字段Field對象儡遮,但是這...
- 在我們開發(fā)過程中常常有一個需求,就是要知道實體類中Getter方法對應(yīng)的屬性名稱(Field Name)暗赶,例如實體...
- 1.考慮安全訪問范圍內(nèi)的屬性岳锁,沒有權(quán)限訪問到的屬性不讀取 2.不考慮從祖先類繼承的屬性绩衷,只獲取當(dāng)前類屬性,包括四類...