それらのハイエンド、優雅な注釈はどのように実現されたのですか?

4004 ワード

概要
クラス、方法、またはメンバーの運転時のコメント情報を反射して取得することで、動的制御プログラムの実行ロジックを実現するのも正解の魅力です.もちろん反射は性能に影響を与えるものです.携帯端末では適用されません.しかし、携帯端末にも注釈の枠組みがたくさんあります.彼らはどうやって実現しますか?それはAPT解析コンパイルを使う時の注釈です.コンパイル時には、注釈表示によってJavaコードまたはxmlが動的に生成されますが、実行時には注釈はもう存在しません.コンパイル時に発生したJavaコードによって、必要な業務ロジックが実現されます.普通のjavaコードです.もちろん効率に影響しません.解析はAnnotaion Processing Tool( APT)によって自動的に行われる.この論文は主に反射解析で注釈する方法を分析します.APTは次の章で展開されます.
カスタムコメントシリーズの記事
  • あれらのハイエンド、優雅な注釈はどのように実現したのですか?
  • あれらのハイエンド、優雅な注釈はどのように実現したのですか?
  • あれらのハイエンド、優雅な注釈はどのように実現したのですか?
  • あれらのハイエンド、優雅な注釈はどのように実現したのですか?
  • あれらのハイエンド、優雅な注釈はどのように実現したのですか?
  • あれらのハイエンド、優雅な注釈はどのように実現したのですか?
  • あれらのハイエンド、優雅な注釈はどのように実現しますか?
    解析類の注釈
       /**
         *        
         */
        private static void findAnnotationOnClass() {
            try {
                //1.      
                Class aClass = Class.forName("com.demo.bean.Dog");
    
                //2。       
                boolean isExist = aClass.isAnnotationPresent(Message.class);
    
    
                //3。        
                if (isExist) {
                    Message messageAnnotation = (Message) aClass.getAnnotation(Message.class);
                    System.out.println("     :" + messageAnnotation.decr() + ",  :" + messageAnnotation.author());
                }
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
    具体的にどのように解析してコードを見ますか?私は詳しい注釈を書きました.私の注釈の種類を見ます.
    @Message(decr = "         ",author = "zhang",age = 28)
    public class Dog extends Animal{
    
        String name;
        String age;
    
        @Override
        @Message(decr = "         ",author = "zhang",age = 28)
        public String getName() {
            return name;
        }
    
        @Override
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String getAge() {
            return age;
        }
    
        @Override
        public void setAge(String age) {
            this.age = age;
        }
    }
    
    印刷の結果は
         :         ,  :zhang
    
    二:解析方法における注釈
    方法の注釈を見つけました.二つの方法で注釈の値を解析しました.
        /**
         *         
         */
        private static void findAnnotationOnMethod() {
            try {
                //1.       
                Class> dogClass = Class.forName("com.demo.bean.Dog");
    
                //2。           
                Method[] methods = dogClass.getMethods();
    
                //3。              
                getAnnotationValuesOne(methods);
    
                //4。             
                getAnnotationValuesTwo(methods);
    
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
    第一の取得方法におけるコメント値の解析方法
       /**
         *               
         */
        private static void getAnnotationValuesOne(Method[] methods) {
            //      
            for (Method method : methods) {
                //                
                boolean isExist = method.isAnnotationPresent(Message.class);
                if (isExist) {
                    Message message = method.getAnnotation(Message.class);
                    System.out.println("       :" + message.decr() + ",   :" + message.author() + "--                ");
                }
    
            }
        }
    
    第二の取得方法における注釈値の解析方式
       /**
         *                
         */
        private static void getAnnotationValuesTwo(Method[] methods) {
            //             
            for (Method method : methods) {
    
                //          
                Annotation[] annotations = method.getAnnotations();
    
                for (Annotation annotation : annotations) {
                    if (annotation instanceof Message) {
                        Message message = (Message) annotation;
                        System.out.print("       :" + message.decr() + ",  :" + message.author() + "--                ");
                    }
                }
            }
        }
    
    締め括りをつける
    本編の完全コードはすでにgithubにアップロードされています.必要なものはcloneに行ってください.ちょっと強調してください.ライフサイクルが運行時の注解でなければ、反射によって解析できません.