美文网首页
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注解与反射直接上手

    什么是注解(Annotation) 注解顾名思义为注释、讲解,可以理解为一种标签或标记,可以用在类、方法或者域上。...

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Spring注解原理探索(三)

    之 Java如何识别注解 关键词:Java 反射java.lang.reflect 包,实现反射功能的工具类。注解...

  • Java中的注解和反射

    个人博客http://www.milovetingting.cn Java中的注解和反射 注解 Java注解(An...

  • 注解反射以及动态代理

    注解与反射以及动态代理 注解 注解的定义 Annotation(注解)就是Java提供了一种元程序中的元素关联任何...

  • JAVA反射与注解

    前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几个流行比较屌的第三方库,比如:Butter Knife、...

  • java注解与反射,泛型与反射

    一、反射与注解 内置注解 java内置了3种注解,用来为编译器提供检查。 自定义注解 元注解 元注解是用来修饰注解...

  • 【阿里P8大牛教你Android入门之路(java篇)】——Ja

    一、前言 本部分内容主要包含以下: Java集合 Java反射 Java注解 Java反射 Java IO 其他面...

  • Java 注解(四)注解与反射

    注解与反射机制前面经过反编译后,我们知道Java所有注解都继承了Annotation接口,也就是说Java使用An...

网友评论

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

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