注釈と反射をカスタマイズする簡単な応用

10566 ワード

寄り添って歩まないで、千里までありません;小さな流れを積まなければ,川の海になることはできない.
文書ディレクトリ
  • 元注記
  • @Retention
  • @Documented
  • @Inherited
  • @Target
  • 反射(reflection)
  • 反射の長所と短所:
  • アプリケーション
  • カスタム注記を作成@FiledInfo
  • Userオブジェクトを作成する
  • 反射方法
  • 試験方法
  • メタ注記
             
    

    @Retention
    注記のライフサイクルの定義:source->class->runtime
    @Documented
    ドキュメント注記、Javadocツールによってドキュメント化されます
    @Inherited
    サブクラスに注釈を継承させるかどうか
    @Target
    注記の適用範囲について説明します
  • type:クラス、インタフェース、注釈タイプ、または列挙タイプを修飾するために使用できることを示す.
  • package:パッケージを修飾するために使用できます.
  • parameter:パラメータを修飾するために使用できます.
  • annotation_type:注釈タイプを修飾するために使用できます.
  • method:修飾方法に使用できます.
  • field:属性(列挙定数を含む)を修飾するために使用できます.
  • constructor:コンストラクタを修飾するために使用できます.
  • local_variable:ローカル変数を修飾するために使用できます.

  • 反射(reflection)
          ,       ,                ;        ,                ;                         Java     。
    

    反射のメリットとデメリット:
  • は、反射によりjvmにロードされたクラスの内部情報にプログラムコードをアクセスさせ、ロードされたクラスの属性情報を取得し、ロードされたクラスのメソッドを取得し、ロードされたクラスの構造方法情報を取得する.
  • 反射はJavaプログラムの柔軟性と拡張性を向上させ、結合性を低下させ、適応能力を向上させた.
  • 反射は、コードの可読性を低下させながら、性能に一定の影響を及ぼす.

  • 適用
    仕事中にページの表示内容が不確定な場合があります.このとき、注釈と反射をカスタマイズしてみましょう.後日展示内容を増やしても対応する属性に注釈をつけるだけです.
    カスタム注記の作成@FiledInfo
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FiledInfo {
        String name() default "";
    }
    

    Userオブジェクトの作成
    @Data
    @Accessors(chain = true)
    public class User {
    
        @FiledInfo(name = "  ")
        private String sex;
    
        @FiledInfo(name = "  ")
        private String name;
    
        private String phone;
    }
    

    反射方法(Reflection Method)
    public static List<Map<String, Object>> listFiledInfo(Object object) throws Exception{
    		//       class    
            Class<?> aClass = object.getClass();
            Field[] fields = aClass.getDeclaredFields();
            List<Map<String, Object>> list = new ArrayList<>();
            for (Field field : fields) {
            	//       
                field.setAccessible(true);
            	//        
                FiledInfo info = field.getAnnotation(FiledInfo.class);
                if (info != null) {
                    Map<String, Object> map = new HashMap<>(16);
                    map.put("name", info.name());
                    //         
                    map.put("value", field.get(object));
                    list.add(map);
                }
            }
            return list;
        }
    

    テストメソッド
    public static void main(String[] args) throws Exception{
    		User user = new User().setName("  ").setSex(" ");
    		List<Map<String, Object>> list = listFiledInfo(user);
    		System.out.println(list);
    }
    

    結果を返します.
    [{name=  , value= }, {name=  , value=  }]