JAva注釈:注釈と注釈の継承を解析する
7902 ワード
解析注記:クラス、関数、またはメンバーの実行時注記情報を反射して取得し、動的制御プログラムの実行を実現するロジックです.次に、解析注記とは何かをコードでテストします.注記Descriptionをカスタマイズします.
この注記はChildクラスで使用します.
Descriptionの解析:
実行結果:i am class annotation i am method annotation i am method annotation次に注釈の継承について議論する:1、注釈の継承はクラスに対してであり、インタフェース時に無効な2、注釈は親のクラス注釈のみを継承し、メソッドを継承しない注釈はPersonクラスを:
Childクラスを次のように変更します.
実行結果:i am class interfaceテストの結果、サブクラスは親クラスの注釈のクラス注釈のみを継承し、メソッド注釈は継承されていません.
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テストの結果、サブクラスは親クラスの注釈のクラス注釈のみを継承し、メソッド注釈は継承されていません.