重復注解
@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{ ... }
可重復注解的開發流程
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(); }
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="煮着吃")