Java注解与反射直接上手

什么是注解(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");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值