Java---通過屬性名反射獲取get和set方法

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;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翎猛,一起剝皮案震驚了整個濱河市胖翰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌切厘,老刑警劉巖萨咳,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疫稿,居然都是意外死亡某弦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門而克,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怔毛,“玉大人员萍,你說我怎么就攤上這事〖鸲龋” “怎么了碎绎?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抗果。 經(jīng)常有香客問我筋帖,道長,這世上最難降的妖魔是什么冤馏? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上背率,老公的妹妹穿的比我還像新娘。我一直安慰自己墩划,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布嗡综。 她就那樣靜靜地躺著乙帮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪极景。 梳的紋絲不亂的頭發(fā)上察净,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音盼樟,去河邊找鬼氢卡。 笑死,一個胖子當(dāng)著我的面吹牛恤批,可吹牛的內(nèi)容都是我干的异吻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喜庞,長吁一口氣:“原來是場噩夢啊……” “哼诀浪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起延都,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雷猪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晰房,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體求摇,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年殊者,在試婚紗的時候發(fā)現(xiàn)自己被綠了与境。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡猖吴,死狀恐怖摔刁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情海蔽,我是刑警寧澤共屈,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站党窜,受9級特大地震影響拗引,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幌衣,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一矾削、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦怔软、人聲如沸垦细。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括改。三九已至,卻和暖如春家坎,著一層夾襖步出監(jiān)牢的瞬間嘱能,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工虱疏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留惹骂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓做瞪,卻偏偏與公主長得像对粪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子装蓬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容