2012-05-05 28 views
5

Tôi có một chú thích:Làm thế nào để xử lý các thuộc tính trong ràng buộc chặn

@Inherited 
@InterceptorBinding 
@Retention(RUNTIME) 
@Target({METHOD, TYPE}) 
public @interface Example { 
} 

Và một lớp đánh chặn để xử lý của nó:

@Interceptor 
@Example 
public class ExampleInterceptor implements Serializable { 
... 
} 

Tôi muốn thêm một văn bản thông số:

public @interface Example { 
    String text(); 
} 

Nhưng tôi không biết cách xử lý tham số trong lớp ngăn chặn. Làm thế nào để sửa đổi chú thích của lớp?

@Interceptor 
@Example(text=???????) 
public class ExampleInterceptor implements Serializable { 
... 
} 

Nếu tôi viết @Example(text="my text"), đánh chặn được gọi là chỉ khi một phương pháp/lớp được chú thích với @Example(text="my text"). Nhưng tôi muốn máy đánh chặn được gọi là độc lập trên giá trị tham số - @Example(text="other text").

Và cách nhận giá trị tham số? Tôi có phải sử dụng phản xạ hoặc có cách nào tốt hơn không?

Trả lời

11

Trình chặn được gọi cho mọi giá trị thuộc tính khi chú thích @Nonbinding được sử dụng.

chú giải:

public @interface Example { 
    @Nonbinding String text() default ""; 
} 

Interceptor:

@Interceptor 
@Example 
public class ExampleInterceptor implements Serializable { 
    ... 
} 
+1

Để nhận được giá trị của chú thích trên phương pháp chặn trong bộ chặn: Gọi lệnhContext ctx; Ví dụ mẫu = ctx.getMethod(). GetAnnotation (Example.class); Giá trị chuỗi = example.value(); – dbricman

+0

Điều gì sẽ xảy ra nếu tôi không muốn thêm phương thức mặc định để buộc tất cả các sử dụng chú thích phải chỉ định giá trị? Trong trường hợp của tôi, nó là một giá trị enum thay vì một chuỗi, do đó, nó có ý nghĩa nhỏ để đặt @Example (MyEnum.SPECIFIC_VALUE) vào lớp ngăn chặn. – Mano

0

Thứ nhất, nếu bạn chỉ có một tham số bạn có thể đặt tên cho nó value và sau đó có thể bỏ qua tên tham số (mặc định), => có thể bỏ qua text = phần, như:

@Example("my text") //instead of @Example(test="My text") 
public class ... 

Để truy cập vào một chú thích bạn sử dụng phương pháp getAnnotation trên các loại Class, Method, Field hoặc Constructor mà bạn cần phải nhận được linh sam. Sau đó, bạn nhận được một thể hiện của chú thích mà bạn có thể gọi các phương thức của bạn trên đó.

Example example = getClass().getAnnotation(); //if you are inside the interceptor you can just use getClass(), but you have to get the class from somewhere 
example.value(); //or example.text() if you want your annotation parameter to be named text. 
+0

Cảm ơn bạn đã trả lời, nhưng tôi vẫn không biết làm thế nào để viết chú thích cho lớp đánh chặn. Tôi không thể viết @Example vì nó muốn có tham số. Nếu tôi viết @Example ("văn bản của tôi"), trình chặn được gọi chỉ khi một phương thức/lớp được chú thích bằng @Example ("văn bản của tôi"). Nhưng tôi muốn các interceptor được gọi là độc lập trên giá trị tham số - @Example ("văn bản khác"). Tôi có nên sử dụng cụm từ thông dụng không? Nó dường như không hoạt động. – ziri

+0

Bạn có biết ý tôi là gì không? Ông có thể giúp tôi với điều này? – ziri

Các vấn đề liên quan