java 反射知識點

反射的private屬性
  1. 反射的private屬性只能某種程度上限制對字段和方法的訪問,可以還是可以依靠反射獲取,那麼爲什麼要有反射這個屬性呢?
    private並不能保證類的字段絕對安全不被訪問,事實上並沒有真正安全的辦法保證你的代碼的安全。private的作用在筆者看來更像是一種聲明,一種標籤。就像把這個字段標上(不常用)之類的標籤一樣。private字段標記,是OOP(面向對象編程)的一種使用,使用字段後,可以更加方便得實現對代碼得操作。例如在idea的方法提示裏,並不會出現對private字段、方法的代碼提示。
  2. setAccessible()方法
    Java反射機制提供的setAccessible()方法可以取消Java的權限控制檢查,之後可以通過反射來訪問和修改類的屬性和方法。另外,我們可以啓用java.security.manager來判斷程序是否具有調用setAccessible()的權限。默認情況下,內核API和擴展目錄的代碼具有該權限,而類路徑或通過URLClassLoader加載的應用程序不擁有此權限。
  3. 應用
    spring的反射也可以反射私有屬性和方法。
個人反射應用
  1. 通過反射獲取類字段並校驗(包括父類字段)
    	public static <T>String[] checkString (Object obj, Class<T> clazz){
    //        Field[] declaredFields = clazz.getDeclaredFields();
            String[] result =null;
            List<Field> declaredFields = new ArrayList<>() ;
            while (clazz != null) {//當父類爲null的時候說明到達了最上層的父類(Object類).
                declaredFields.addAll(Arrays.asList(clazz .getDeclaredFields()));
                Class tempClass =clazz.getSuperclass(); //得到父類,然後賦給自己
                clazz = tempClass;
            }
            try {
                for (Field field : declaredFields) {
                    //用於獲取private成員變量
                    field.setAccessible(true);
                    //獲取字段值
                    Object o = field.get(obj);
                    //檢驗是否合法並返回
                    if(o!=null){
                        if(!LegalStringUtils.isLegal(String.valueOf(o))){
                            result = ArrayUtils.addAll(result,LegalStringUtils.getIllegalChars((String)o));
                        }
                    }
                }
            } catch (IllegalAccessException e) {
                    e.printStackTrace();
            }
            return result;
        }
    
    //校驗方法
    private final static String REG_CN_EN_NUMBER = "[\\u4e00-\\u9fa5]|[(A-Za-z)|(0-9)]";
    private final static String REG_EN_CHAR = ";'\"|\\/?,.<>[]{}()!-=+- @#$%^&*~`";
    private final static String REG_CN_CHAR = ";‘“|、/?,。《》【】{}()!-=+——@#¥%……&*~·";
    /**
     * 判斷字符串是否合法
     *
     * @param str :待校驗字符串
     * @return true or false
     */
    public static boolean isLegal(String str) {
        for (int i = 0; i < str.length(); i++) {
            String s = String.valueOf(str.charAt(i));
            if (!(s.matches(REG_CN_EN_NUMBER) || REG_EN_CHAR.contains(s) || REG_CN_CHAR.contains(s))) {
                return false;
            }
        }
        return true;
    }
    /**
     * 返回字符中的非法字符合集
     *
     * @param str :待校驗字符串
     * @return 若字符串合法,返回空數組,否則返回非法字符數組
     */
    public static String[] getIllegalChars(String str) {
        String results = "";
        for (String s : str.split("")) {
            if (!(s.matches(REG_CN_EN_NUMBER) || REG_EN_CHAR.contains(s) || REG_EN_CHAR.contains(s))) {
                if (results.equals("")) {
                    results = s;
                } else {
                    results += ("," + s);
                }
            }
        }
        return results.split(",");
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章