定義された注釈
@interfaceで定義されたノート
public @interface Log {
}
复制代码
それはほとんど道のキーワードとインタフェースの定義だが、1の前に@記号
Notesアプリケーション
上記実施形態のアプリケーションは、具体的に後に言えば、非常に単純なクラスにアノテーション又はよう@xxを添加する方法であります
public class Controller {
@Log
public void test(){
}
}
@Log
public class Controller {
public void test(){
}
}
复制代码
元のメモ
メタ注釈:注釈注釈が定義されている、コメントにコメントに定義することができ、基本的な注釈です
@保持
ライフサイクルを説明するために使用ノート
@Retention(RetentionPolicy.SOURCE)ノートはコンパイルを廃棄し、ソース段階でのみ保持しました
@Retention(RetentionPolicy.CLASS)デフォルトのポリシー、注釈のみ行っビルドに時間が保持され、それがJVMにロードされることはありません。
@Retention(RetentionPolicy.RUNTIME)プログラムはまた、それを得ることができます実行されているので、プログラムが実行されている場合、注釈を保持することができ、それは、JVMにロードされます。
@Documented
文書化された注釈は、これがデフォルトで記録されたJavadocコメントが同様の記録ツールを持っていることを示しています。型宣言が文書化され注釈されている場合は、公開APIの一部となって指摘しています。
ターゲット注釈の役割を説明@Target
@Target(ElementType.TYPE)インターフェース、クラス、列挙、注釈
@Target(ElementType.FIELD)フィールド、列挙定数
@Target(ElementType.METHOD)方法
@Target(ElementType.PARAMETER)メソッドのパラメータ
@Target(ElementType.CONSTRUCTOR)コンストラクタ
@Target(ElementType.LOCAL_VARIABLE)ローカル変数
@Target(ElementType.ANNOTATION_TYPE)注解
@Target(ElementType.PACKAGE)包
@遺伝性の
@Inherited:あなたはこの注釈1にコメントを使用する場合は、クラスを使用し、これはまた、クラスの効果の1つのサブクラスに注意してください。例えば:
@Inherited
@Target(ElementType.METHOD)
public @interface Log {
}
@Log
public class testA(){}
public class testB() extends testA{}
复制代码
種皮は@Logこのコメントがあり、その後、TESTBクラス以上、この注釈@Logを適用します。
@Repeatable
例えば:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Logs {
Log[] value();
}
@Repeatable(Logs.class)
public @interface Log{
String descr() default "";
}
public class Controller {
@Log(descr="描述1")
@Log(descr="描述2")
public void test(){
}
}
public class LogRunner {
public static void main(String []args) throws Exception{
System.out.println("开始时间:"+new Date());
Class classs=Controller.class;
Method[] ms=classs.getMethods();
for(Method method:ms){
boolean flag=method.isAnnotationPresent(Logs.class);
if(flag){
Logs logs=method.getAnnotation(Logs.class);
for(Log log:logs.value()){
System.out.println(log.descr());
}
}
}
}
}
复制代码
出力が出力されると、記述1、2について説明します。
カスタムアノテーションを実装します
最初のステップは、コメントを定義することです
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Log {
String methodName() default "defaultAMethod";
String controller() default "defaultController";
String descr() default "defaultDescr";
}
复制代码
第二段階は、このコメントを適用しました
public class Controller {
@Log
public void test(){
System.out.println("结束时间:"+new Date());
}
}
复制代码
第3のステップは仕事を反映してこのコメントを作ることです
public class LogRunner {
public static void main(String []args) throws Exception{
System.out.println("开始时间:"+new Date());
Class classs=Controller.class;
Method[] ms=classs.getMethods();
for(Method method:ms){
boolean flag=method.isAnnotationPresent(Log.class);
if(flag){
Log log=method.getAnnotation(Log.class);
System.out.println(log.methodName());
System.out.println(log.descr());
System.out.println(log.controller());
method.invoke(classs.newInstance(),null);
}
}
}
}
复制代码
輸出
上記のコメントの第2のステップは、デフォルト値を使用しない場合は、コードを変更します
public class Controller {
@Log(methodName = "test",controller = "testController",descr = "测试")
public void test(){
System.out.println("结束时间:"+new Date());
}
}
复制代码
これは、出力は以下となります