美文网首页
Java注解与反射直接上手

Java注解与反射直接上手

作者: NullUser | 来源:发表于2019-03-18 21:11 被阅读0次

    什么是注解(Annotation)

    注解顾名思义为注释、讲解,可以理解为一种标签或标记,可以用在类、方法或者域上。向类、方法等添加注解,相当于给他们贴上了一层标签。

    注解使用

    在使用注解时,在类名、方法名、域上直接用@+注解名即可。比如一个叫做MyAnnotation的注解:
    1.类注解
    在类A上添加@MyAnnotaion,即用MyAnnotation注解了类A。方法、域同理。

    @MyAnnotation
    public class A{
      
    }
    

    2.方法注解
    用MyAnnotation注解了方法method()。

    @MyAnnotation
    public void method(){
      //TODO
    }
    

    3.域注解。
    用MyAnnotation注解了域a

    public class A{
      @MyAnnotation
       int a;      //域a
    }
    

    自定义注解

    java给我们提供了很多注解,有时我们需要自定义的注解。自定义注解和接口定义很像,比如我们定义一个叫做MyAnnotation的注解,像下面这样就定义好了。

    public @interface MyAnnotation{
       
    }
    

    注解属性

    注解的作用不只是一个名字那么简单,它可以包含许多属性,即成员变量,就像一张标签上可以写很多东西一样。所以可以在定义注解时添加各种属性。

    public @interface MyAnnotation{
      int id();
      String msg();
    }
    

    MyAnnotation注解中的id、msg就是它的属性。可以看到定义属性,和在接口中定义方法类似。
    定义属性过后,我们在使用注解时就可以加上属性值。如下在注解类A时,声明了属性id=0,msg为hello:

    @MyAnnotation(id = 0,msg = "hello")
    class A{
      
     }
    

    --注意--
    1.在使用注解时,属性都要赋值,如上面的id = 0,多个属性用逗号(,)隔开。
    2.定义注解时可以给属性加上默认值,这样可以在使用的时候不用赋值。定义默认值用default,如下定义连个属性的默认值分别为1和“hi”

    public @interface MyAnnotation{
      int id() default 1;
      String msg() default "hi";
    }
    

    3.如果一个注解内仅仅只有一个名字为 value 的属性时,可以直接在括号内填写属性值,如:

    public @interface MyAnnotation{
      int value();
    }
    

    使用时可以不需要value = 0,直接填写0,当然填写value=0也是正确的。

    @MyAnnotation(0)
    class A{
      
     }
    

    反射(Reflaction)获取注解

    JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。就像我们看世间万物,都是光反射进我们眼睛的结果,光反射是什么样,我们看到的就是什么样,为什么太空是黑的?就是因为太空没有灰尘反光。
    JAVA的反射也是同理,我们需要获取类的信息时,就需要通过反射。注解的获取同样是通过反射。

    • 获取注解有几个主要方法。
      1.isAnnotationPresent()是否含有某个注解。
    public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
    

    比如获取类A是否有注解MyAnnotation,有返回true,没有返回false。

    boolean b = A.class.isAnnotationPresent(MyAnnotation.class);
    

    2.getAnnotation()获取某种注解对象。

    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
    

    比如获取类A的注解对象。获取到后我们就得到应用在类A时该注解的属性值。

    MyAnnotation m = A.class.getAnnotation(MyAnnotation.class);
    int id = m.id();
    String msg = m.msg();
    

    3.getAnnotations()获取应用的所有注解,结果存进数组。

    public Annotation[] getAnnotations() {}
    
    • 除了用类调用上述方法,我们还可以获取到该类中的方法和域去调用。
      假如类A有方法method(),有域a。
    public class A{
      int a;
      public void myMethod(){
        //TODO
      }
    }
    

    1.获取类方法,参数为方法名字符串。

    Method method = A.class.getDeclaredMethod("myMethod");
    

    2.获取域

    Field field = A.class.getDeclaredField("a");
    

    相关文章

      网友评论

          本文标题:Java注解与反射直接上手

          本文链接:https://www.haomeiwen.com/subject/ebabmqtx.html