|

楼主 |
发表于 2011-11-1 15:08:27
|
显示全部楼层
如何定义自己的Annotation
本帖最后由 菜得要自杀 于 2011-11-1 15:21 编辑
想必经过上面三个例子,大家都懂了如果用..很简单。可是如何写呢?
这里用到一个新的关键字:@interface。(好吧,我偷懒了,我拿我学习时的代码直接发上来。)
具体代码如下:
- package Annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- //下面这行代码,表示这个注解可以加在成员变量上,也可以加上方法上,还可以加上类型上
- @Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
- //下面这行代码表示这个注解将会编译到class中,并且可以利用反射获取到。
- @Retention(value = RetentionPolicy.RUNTIME)
- public @interface MyAnnotation {
- String value();
- String name() default "makai";
- Direction dir();
- }
- enum Direction{
- EAST,
- SOUTH,
- WEST,
- NORTH;
- }
复制代码
- package Annotation;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- @MyAnnotation(value = "Hello Fishc",dir = Direction.EAST)
- public class MyAnnotationUsage {
- int a = 9;
-
- public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- new MyAnnotationUsage().haha();
-
- MyAnnotationUsage mau = new MyAnnotationUsage();
- Class<? extends MyAnnotationUsage> c = mau.getClass();
- Method m = c.getMethod("hehe", new Class[]{});
-
- if (m.isAnnotationPresent(MyAnnotation.class)) {
- m.invoke(mau, new Object[]{});
- MyAnnotation ma = m.getAnnotation(MyAnnotation.class);
- System.out.println(ma.value());
- }
- }
-
- /**
- * 一般情况下,如果MyAnnotation中有属性叫value,那么这个可以直接赋值,不用写等号。
- * 不过最好还是写上,因为两个以上值的时候,如果有别的属性有默认值,且省略不写,那么value必须赋值
- * 给多个属性赋值,中间用","号隔开,还有,数组的大括号可以省略不写..
- */
- @MyAnnotation(value = "Hello Fishc", name = "菜得要自杀", dir = Direction.EAST)
- private void haha() {
- System.out.println("Hi");
- }
- }
复制代码
以上就是自定义注解。。。
|
|