反射格式化bean字符串空格

/**
     * 去除實體類所有String類型屬性的空格
     * @author yupanpan
     * @date 2019/9/25 10:04
     * @param object
     * @param b true-去除字符串所有空格 false-只去除頭尾空格
     * @return java.lang.Object
     */
    public static Object formatBeanStringBlankSpace(Object object,Boolean b){
        //獲取該類中所有的域(屬性)
        Field[] fields = object.getClass().getDeclaredFields();
        for(Field field : fields){
            //對所有的屬性判斷是否爲String類型
            if(field.getType().equals(String.class)){
                //將私有屬性設置爲可訪問狀態
                field.setAccessible(true);
                try {
                    Object o = field.get(object);
                    if(o!=null&&!o.equals("")){
                        String string = (String)o;
                        if(b){
                            string = string.replaceAll(" ","");
                        }else {
                            string=string.trim();
                        }
                        //相當於調用了set方法設置屬性
                        field.set(object,string);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return object;
    }

有意思的是string.trim(),百分之九十的都認爲就是去除頭尾空格,其實不是

看以下代碼

把代碼放入Idea,是以下效果

放入Myeclipse/Eclipse,不會識別。是以下效果

放入Notepad++,長下面的樣子

最主要的是後面的被trim()掉了,這個特殊的符號在eclipse是看不到的,不佔空間。如果在代碼中出現這種的字符串,特別是eclipse,排查問題會非常痛苦

 

從這一點可以看出,trim()不只是去除空格那麼簡單,查看源碼

從註釋來看,再結合ASCII看,空格對應32,其實trim()過濾的是32以及之前的字符,一般出現此類問題很少,如果始終不知道問題,可以從這點着手,我們比較熟悉的水平製表符(^I),回車(^M),以及Hive中默認使用的字段分隔符^A等等都會被過濾

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章