Java注釈のあれらの事

26863 ワード

注釈(メタデータとも呼ばれる)は、コードに情報を追加するための形式的な方法を提供し、後でこれらのデータを容易に使用することができます.たとえば、記述子の性質のクラスやインタフェースを作成するときに、重複作業が含まれると、注釈を使用してプロセスを簡素化し、自動化することを考慮することができます.
注記の出現はjdk 1である.5に導入された注釈の使用はjava反射の使用を伴うことが多い.次にjdkに組み込まれている3つの標準注釈と4つのメタ注釈について説明します.
3つの標準注記はlangパッケージの下に定義され、それぞれ:@Override,@Deprecated,@SuppressWarningである.
@Override:                  。

@Deprecated:                  。

@SuppressWarning:              。

4つのメタ注記:それぞれ@Target,@Retention,@Documented,@Inheritedである.
@Target:            。   ElementType    :
					1.Constructor:      。
					2.Field:   (  enum  )。
					3.Local_Variable:      。
					4.Method:    。
					5.Package:   。
					6.Parameter:    。
					7.Type: ,  (      ) enum  。
					
@Retention:                。   RetentionPolicy    :
					1.Source:         。
					2.Class:   class     ,   VM  。
					3.Runtime:VM        ,              。
@Documented:       JavaDoc 。

@Inherited:            (     ,            ,    ,      )

次にコードを説明します.注記@interfaceを定義します.注記の注記要素の使用可能なタイプは次のとおりです.
  • すべての基本データ型
  • String
  • Class
  • enum
  • Annotation
  • 以上のタイプの配列形式
  • package com.example.bootDemo.Anno;
    
    
    import java.lang.annotation.*;
    
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface Description {
        //          ,         String value();
        //String value();
    
        String name();
    
        int age();
    
        String address() default "xxxx"; //         ,   xxxx
    }
    
    package com.example.bootDemo.Anno;
    @Description(name = "parent_className",age = 18,address = "PPPP")
    public class Parent {
    
        @Description(name = "parent",address = "ppp",age = 50)
        public void say(){
    
        }
    }
    
    package com.example.bootDemo.Anno;
    
    import java.lang.reflect.Method;
    
    public class Test {
        public static void main(String[] args){
            try {
                Class> clazz = Class.forName("com.example.bootDemo.Anno.Parent");
                //          
                boolean exist = clazz.isAnnotationPresent(Description.class);
                if(!exist){
                    return;
                }
    
                Description classAnno = clazz.getAnnotation(Description.class);
                System.out.println(classAnno.name()+"  "+classAnno.age()+"  "+classAnno.address());
    
                //           
                Method[] methods = clazz.getMethods();
                if(null == methods){
                    return;
                }
                for (Method m: methods) {
                    boolean b = m.isAnnotationPresent(Description.class);
                    if(!b){
                        return;
                    }
                    Description methodAnno = m.getAnnotation(Description.class);
                    System.out.println(methodAnno.name()+"  "+methodAnno.age()+"  "+methodAnno.address());
                }
    
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    
    

    Description注記を定義し、class、methodレベルでのみ使用します.VMの実行時に注記は破棄されず、javaDocに含まれ、子クラスが親クラスを継承できるようにします.
    注記クラスには、Stringタイプ、intタイプ、Stringタイプの3つの変数が定義されており、注記の値を解析する際に、反射メカニズムを使用してクラス情報をロードします.isAnnotationPresent()メソッドを使用して、クラス、メソッドにカスタム注釈が存在するかどうかを判断し、class、methodレベルでgetAnnotation()を使用して指定した注釈の情報を取得し、値を取得します.
    次に、sql文を印刷する小さな機能を実装します.注釈実装を使用します.まず、2つの注釈@Tableを定義してテーブル名(データベース・テーブル名と一致する)を指定し、@Colunmはフィールド名を指定します.
    package com.example.bootDemo.Anno;
    import java.lang.annotation.*;
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface Table {
        String value();
    }
    
    
    package com.example.bootDemo.Anno;
    import java.lang.annotation.*;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface Column {
        String value();
    }
    
    

    ユーザーテーブルでカスタム注釈を使用しようとしました
    package com.example.bootDemo.Anno;
    @Table("user")
    public class User {
    
        @Column("id")
        private Integer id;
    
        @Column("name")
        private String name;
    
        @Column("email")
        private String email;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    }
    

    テストコード:
    package com.example.bootDemo.Anno;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class TestSql {
    
        //    ,      ,         sql
        public static void main(String[] args) throws Exception{
            User user = new User();
            user.setId(2);
    
            String sql1 = querySql(user);
            System.out.println(sql1);
    
            user.setName("  ");
            String sql2 = querySql(user);
            System.out.println(sql2);
    
            user.setEmail("[email protected];[email protected]");
            String sql3 = querySql(user);
            System.out.println(sql3);
        }
    
        static String querySql(Object obj) throws Exception{
            StringBuffer sb=new StringBuffer();
            //            
            Class<?> clazz = obj.getClass();
            //       @Table  
            boolean isTable = clazz.isAnnotationPresent(Table.class);
            if(!isTable){
                return null;
            }
            Table table = clazz.getAnnotation(Table.class);
            //    
            String tableName = table.value();
    		//  sql  
            sb.append("select * from ").append(tableName).append(" where 1=1 ");
            
            //------        
            //      
            Field[] fields = clazz.getDeclaredFields();
            for (Field field: fields) {
                boolean isColumn = field.isAnnotationPresent(Column.class);
                if(!isColumn){
                    continue;
                }
                Column fieldAnnotation = field.getAnnotation(Column.class);
                //      
                String fieldName = fieldAnnotation.value();
                
                //    get  ,  invoke       
                String methodToGetValue="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1,fieldName.length());
    
                Method method = clazz.getMethod(methodToGetValue);
                Object fieldValue = method.invoke(obj);
    
                if(null == fieldValue){
                    continue;
                }
                sb.append(" and ");
                if(fieldValue instanceof String ){
    
                    if(((String) fieldValue).contains(";")){
                        sb.append(fieldName+" in ("+((String) fieldValue).replaceAll(";",",")+")");
                    }else {
                        sb.append(fieldName+"= " + fieldValue);
                    }
                }
                if(fieldValue instanceof Integer){
                    sb.append(fieldName+"= "+fieldValue);
                }
            }
            return sb.toString();
        }
    }
    
    select * from user where 1=1  and id= 2
    select * from user where 1=1  and id= 2 and name=   
    select * from user where 1=1  and id= 2 and name=    and email in (1339148474@qq.com,572212558@qq.com)
    

    簡単な説明をするだけで、具体的な複雑な論理には大量のsql文の適合が必要です.