2017-05-08 87 views
0

讓我們如下定義了一個註解:我們是否可以枚舉或預定義註釋,這些註釋可以被代碼重用?

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CheckSomething { 
    String validIdentity() default ""; 
    String validUserGroup() default "google"; 
} 

我有一些註釋集這是可能在我的應用,我想使用它們。

例如:

2註釋如下:

HumanCheckSomething, RobotCheckSomething - calling these for identification 

@CheckSomething(validIdentity = "IAMSTRING", validUserGroup = "HUMANS") 
@CheckSomething(validIdentify = "123", validUserGroup = "ROBOTS") 

現在,我想創建一個使用上面標註的枚舉 - HumanCheckSomething,RobotCheckSomething和重用在我的代碼,標註一些方法。

@MyEnum.HumanCheckSomething 
void allowOnlyHumans(){} 

@MyEnum.RobotCheckSomething 
void allowAll(){} 

代替

@CheckSomething(validIdentity = "IAMSTRING", validUserGroup = "HUMANS") 
void allowOnlyHumans(){} 

@CheckSomething(validIdentify = "123", validUserGroup = "ROBOTS") 
void allowAll(){} 

回答

1

不,那是不可能的。但是許多框架使用「元註釋」來解決這個問題:您定義自己的註釋(例如,CheckHuman),它本身用原始註釋(例如@CheckSomething(validIdentity = "IAMSTRING", validUserGroup = "HUMANS"))註釋。然後,當您使用@CheckHuman註釋某個類(或字段,方法或其他)時,框架會執行相同的操作,就像直接使用原始註釋進行註釋一樣。

查看Spring的GetMapping annotation,例如,這是@RequestMapping(method=GET)的元註釋。

該模式的另一個優點是它允許在一個註釋中結合幾個註釋。例如@RestController是一個元註釋,它結合了@Controller@ResponseBody

相關問題