java 編程基礎 注解 :可重復的注解


重復注解

Java8以前,同一個程序元素前最多只能使用一相同類型的注解;如果需要在同一個元素前使用多個相同類型的注解,則必須使用注解"容器"。例如在Struts開發中,有時需要在 Action 類上使用多個@Result注解。在 Java8 以前只能寫成如下形式:
@Results({
    @Result(name="failure", location="failed.jsp"),
    @Result(name="success ", location ="succ.jsp")
})
public Acton FooAction{ ... }

java8以后可以這樣寫

@Result(name="failure", location="failed.jsp"),
@Result(name="success ", location ="succ.jsp")
public Acton FooAction{ ... }

可重復注解的開發流程

1,首先定義我們需要重復的注解( @Repeatable(ActionTodos.class)就表示我們的注解是可重復的,並且重復的容器是ActionTodos
package com.zmd.repeatAnotation;

import java.lang.annotation.*;

/**
 * @ClassName ActionTodo
 * @projectName: object1
 * @author: Zhangmingda
 * @description: 可重復注解
 * date: 2021/5/19.
 */
//@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(ActionTodos.class)
public @interface ActionTodo {
    String actionListenerName();
}
2,容器注解定義:
package com.zmd.repeatAnotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @ClassName ActionTodos
 * @projectName: object1
 * @author: Zhangmingda
 * @description: 容器注解
 * date: 2021/5/19.
 */
//容器
@Retention(RetentionPolicy.RUNTIME)
//@Target(ElementType.TYPE)
public @interface ActionTodos {
    ActionTodo[] value();
}

3,具體的使用:

package com.zmd.repeatAnotation;

import javax.swing.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

/**
 * @ClassName UseRepeatable
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/5/19.
 */
@ActionTodo(actionListenerName = "打鳥")
@ActionTodo(actionListenerName = "掏蛋")
@ActionTodo(actionListenerName = "煮着吃")
public class UseRepeatable {
    @ActionTodo(actionListenerName = "打鳥")
    @ActionTodo(actionListenerName = "掏蛋")
    @ActionTodo(actionListenerName = "煮着吃")
    private static JButton okButton = new JButton("一石N鳥");
    public static void main(String[] args) throws NoSuchFieldException {
        /**
         * 獲取注解容器
         */
        Annotation[] annotations = UseRepeatable.class.getAnnotations();
        for (Annotation annotation : annotations){ //獲取所有注解,包含容器注解
            System.out.println(annotation); //獲取所有注解,包含容器注解
        }

        Field okbtnField = UseRepeatable.class.getDeclaredField("okButton");
        Annotation[] actions = okbtnField.getAnnotations(); //獲取所有注解,包含容器注解
        //ActionTodo[] actions = okbtnField.getAnnotationsByType(ActionTodo.class); //可重復注解
        for (Annotation actionTodo :actions) {
            System.out.println(actionTodo);
        }
        /**
         * 獲取注解類的重復注解
         */
        ActionTodo[] actionTodos = UseRepeatable.class.getAnnotationsByType(ActionTodo.class);
        for (ActionTodo actionTodo : actionTodos){
            System.out.println(actionTodo);
        }
        /**
         * 獲取屬性(類變量)的重復注解
         */
        //獲取變量反射對象
        Field[] fields = UseRepeatable.class.getDeclaredFields();
        //循環判斷
        for (Field field:fields){
            field.setAccessible(true);
            //是否被容器注解修飾
            if (field.isAnnotationPresent(ActionTodos.class)){
                //獲取注解列表
                ActionTodo[] actionTodos1 = field.getAnnotationsByType(ActionTodo.class);
                for (ActionTodo actionTodo:actionTodos1){
                    System.out.println(actionTodo);
                }
            }
        }
    }
}

測試使用輸出

@com.zmd.repeatAnotation.ActionTodos(value={@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鳥"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")})
@com.zmd.repeatAnotation.ActionTodos(value={@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鳥"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")})
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鳥")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鳥")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM