黑马程序员技术交流社区

标题: 【武汉校区】Java注解 [打印本页]

作者: 武汉分校-小舞    时间: 2019-3-12 16:13
标题: 【武汉校区】Java注解
注解
注解是代码级别的说明,用来描述代码。可以使用在类、方法、字段(成员变量)、接口、包上等。对代码本身没有
影响,可以看做是一个【标记】
举个例子帮助理解:我是一个程序员,会写代码,但是经常被人欺负有一天被人打了。为了不让被人欺负,我在身
上纹了纹身,看起来很吓人。于是当别人想打我的时候,看到我身上的纹身就不敢打了我。


这里纹身就是一个标记,可以给别人起到威慑的作用。但是并不影响我作为程序员完成 敲代码的工作。
同理注解就好比纹身,它可以给类、成员变量、方法、接口等一些额外的标记信息,并 不影响代码的主要功能,只
不过加上注解后多了一些额外的信息。
元注解
元注解有点不太好理解,因为它是用来描述注解的注解。
在定义注解时,为了说明注解保留在那个阶段,以及可以使用的目标等(现在可能还看不懂,继续往下看)。
@Target : 描述注解使用的目标(类、方法、变量...)
@Retention: 描述注解保留到那个阶段(SOURCE,CLASS,RUNTIME)
Java 内置注解
Java5 之后引入的注解,并且提供了几个内置注解,下面介绍几个常用的注解, 其中@Override e我们也经常用到
@Override 用来标记方法是复写的父类方法
@Deprecated 用来描述一个方法或者类已过时
@SupperssWarnings 压制警告(在IDEA和Ecipse中的黄色波浪线,强迫症者了解一下)
@FunctionalInterface 描述一个接口为函数式接口

以@Override 为例,我们看一下它的源码,学习注解是怎么定义的 @Override 注解是 Java 内置的,我们在 IDEA
或者 Eclipse 这样的高级编辑器中写代码,它们 会通过识别@Override 注解来确定是否为复写的方法,并根据方法
复写的要求给出明显的语 法提示。


@Target 元注解 说明@Override 注解只能使用在方法上,所以我们在其他地方使用就是错误 的。 @Retenttion 元
注解,说明@Override 注解在源代码阶段有效,所以写代码的时候 IDEA 可以 提供编译检查。 其他注解这里不做
详细解释、简单知道他们有什么用就可以了

自定义注解
前面看了@Override 注解的定义,其实代码很简单。
新建一个注解@Pro;
然后用@Target 元注解说明一下使用目标;
使用@Retention 说明注解保留在哪个阶段;
在注解中写上几个属性,注解中的属性比较特殊属性名后面加上一对小括号(本质上它是一个方法,当做属
性理解就可以了)。

//定义一个注解,就是定义一个标签。
//标签可以用在哪些地方,通过@Target指定
//标签可以保留到那个阶段,通过@Retention指定
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
//属性列表--本质就是抽象方法
String classname(); //属性为String类型
String methodname(); //属性为基本类型
}
使用注解
在 Test 类中解析类上的注解,使用反射来获取注解提供的信息,并使用
@Pro(classname = "com.itheima.test.Game",methodname = "play")
public class Test {
public static void main(String[] args) throws Exception{
//通过注解所在的Class文件,获取类上的Pro注解
Pro pro = Test.class.getAnnotation(Pro.class);
//再通过注解,获取注解上的属性值
String classname = pro.classname();
String methodname = pro.methodname();
//再通过反射加载classname对应的类
Class<?> clazz = Class.forName(classname);
Object obj = clazz.getConstructor().newInstance();
//通过字节码获取到methodname方法
Method method = clazz.getMethod(methodname);
//让方法执行
method.invoke(obj);
}
}

注解总结
玩注解分为 3 个步骤:定义注解、使用注解、解析注解。
这 3 个步骤给你做一个比喻《奔跑吧兄弟》应该都看过,里面有个游戏叫“撕名牌”。
定义注解(制作名牌),使用注解(贴名牌),解析注解(撕名牌)

定义注解
注解使用@interface来定义 ,定义注解使用需要使用元注解说明注解使用的目标、保留的阶段,注解可以包含属
性。
在定义注解时可以通过元注解说明,注解保留的阶段,以上讲的是运行阶段的注解。
使用注解
按照定义注解规定的目标,把注解放在对应的代码上,有属性的话需要给属性赋值
解析注解
如果是自定义的注解,需要自己编写代码去解析注解获取注解描述的信息,并根据需求使用,否则不然注解毫无意
义。











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2