java 注解与反射_Java注解与反射直接上手
发布日期:2021-06-24 16:13:24 浏览次数:4 分类:技术文章

本文共 2055 字,大约阅读时间需要 6 分钟。

什么是注解(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 getAnnotation(Class 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");

转载地址:https://blog.csdn.net/weixin_33744799/article/details/114413571 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java按钮退出_java – 如何在此程序中添加退出按钮?怎么样“清楚”?
下一篇:opensips mysql 认证_基于ubuntu中使用mysql实现opensips用户认证的解决方法

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月02日 00时02分31秒