首页 > 编程语言 > 详细

java 编程基础 注解 :可重复的注解

时间:2021-05-20 00:02:08      阅读:18      评论:0      收藏:0      [点我收藏+]

重复注解

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) {
        /**
         * 获取注解容器
         */
        Annotation[] annotations = okButton.getClass().getAnnotations();
        for (Annotation annotation :annotations){
            System.out.println(annotation);
        }
        /**
         * 获取注解类的重复注解
         */
        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);
                }
            }
        }
    }
}

测试使用输出

@java.beans.JavaBean(defaultProperty="UIClassID", description="An implementation of a \"push\" button.", defaultEventSet="")
@javax.swing.SwingContainer(delegate="", value=false)
@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="煮着吃")

 

 

java 编程基础 注解 :可重复的注解

原文:https://www.cnblogs.com/zhangmingda/p/14787011.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!