JAva注釈:注釈と注釈の継承を解析する

7902 ワード

解析注記:クラス、関数、またはメンバーの実行時注記情報を反射して取得し、動的制御プログラムの実行を実現するロジックです.次に、解析注記とは何かをコードでテストします.注記Descriptionをカスタマイズします.
package com.Annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD,ElementType.TYPE})// :CONSTRUCTOR FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE
@Retention(RetentionPolicy.RUNTIME)// :SOURCE CLASS RUNTIME
@Inherited// : 
@Documented// javadoc 
    public @interface  Description{
    String value();
        int age() default 18;
        }

この注記はChildクラスで使用します.
package com.notation;
@Description("i am class annotation")
public class Child implements Person {
    // 
    @Override
    @Description("i am method annotation")
    public String name() {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public int age() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void sing() {
    }
}

Descriptionの解析:
package com.notation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class ParseAnn {

    public static void main(String[] args) throws ClassNotFoundException {
        // 
        Class c=Class.forName("com.Annotation.Child");
        // 
        boolean isExist=c.isAnnotationPresent(Description.class);
        if(isExist) {
            // 
            Description a=(Description)(c.getAnnotation(Description.class));
            System.out.println(a.value());
        }
        // 
        // 
        Method[] ms=c.getMethods();
        for (Method method : ms) {boolean MExist=method.isAnnotationPresent(Description.class);
            if(MExist) {
                Description a=(Description)(method.getAnnotation(Description.class));
                System.out.println(a.value());
            }

        }
        for (Method method : ms) {
            Annotation[] as=method.getAnnotations();
            for (Annotation annotation : as) {
                if(annotation instanceof Description) {
                    Description a=(Description)annotation;
                    System.out.println(a.value());
                }
            }
        }
    }
}

実行結果:i am class annotation i am method annotation i am method annotation次に注釈の継承について議論する:1、注釈の継承はクラスに対してであり、インタフェース時に無効な2、注釈は親のクラス注釈のみを継承し、メソッドを継承しない注釈はPersonクラスを:
package com.notation;

@Description("i am class interface")
public class Person {
    @Description("i am method interface")
public String name() {
        return null;
    }
public int age() {
    return 0;
}
@Deprecated
public void sing() {
}
}

Childクラスを次のように変更します.
package com.notation;
public class Child extends Person {

    // 
    @Override
    public String name() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int age() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void sing() {
    }
}

実行結果:i am class interfaceテストの結果、サブクラスは親クラスの注釈のクラス注釈のみを継承し、メソッド注釈は継承されていません.