注解是Spring和Mybatis框架所大量使用的技术,要想掌握框架相关技术,注解是必须要掌握的。

掌握注解的优势:

1.能够读懂别人写的代码,特别是框架相关的代码。

2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰。

3.会自定义注解的话能够让人高看一眼。

注解这一概念是在java1.5版本提出的,说Java提供了一种原程序中的元素关联任何信息和任何元数据的途径的方法。

一、Java常见注解

1.JDK自带注解分为三类

实现demo

1.1 首先建一个Person接口

package myAnnountion;

public interface Person {

    public String name();
public int age();
public void work(); }

1.2 然后建一个Person的子类Child类来实现Person这个接口,并实现该类的方法

package myAnnountion;

public class Child implements Person {

    @Override
public String name() {
// TODO Auto-generated method stub
return null;
} @Override
public int age() {
// TODO Auto-generated method stub
return 0;
} @Override
public void work() {
// TODO Auto-generated method stub }
}

可以看到上面代码出现了@Override注解,该注解作用就是告诉我们和编译器该注解下的方法覆盖了Person类的方法。那么假如我们将其父类定义的方法注释呢?

如上例我们将Person类中的name()方法注释,那么其子类中的name()方法就会报错,如图

解决办法就是在父类重新创建该方法或者去掉@Override注释,这样以后大家看到@Override的时候就能很自然的想到这个方法是覆盖了某个接口的方法的。

1.3  对于Person中的work()方法,这里我们可以理解为人是要工作的,但是并不是所有的人都在工作(孩子不需要非得工作),那么怎么办呢?如果说这个接口正在用,我们就不能删除这个方法,这个时候我们就可以在Person类中这样处理:

可以看到在该方法前加了@Deprecated注解后,该方法名也显示了出删除线,表明这个方法已经过时了,对此我们可以测试一下

在该包下新建一个Test测试类

package myAnnountion;

public class Test {

public static void main(String[] args) {
Person person=new Child();
person.work(); }
}

Eclipse中显示警告

可以看到该方法的下划线依旧存在。

1.4 虽然这个方法过时了,但我一定要用怎么办?看上图可以得出我们的解决办法

package myAnnountion;

public class Test {

@SuppressWarnings("deprecation")
public static void main(String[] args) {
Person person=new Child();
person.work(); }
}

@SuppressWarnings("deprecation") 就表示我们忽略了deprecation这样的一个警告。

二、Java第三方注解

第三方注解主要应用与框架,极大地提高了我们编程的效率,这里就不一一介绍了。

三、注解分类

3.1 按照运行机制划分:
【源码注解→编译时注解→运行时注解】

源码注解:只在源码中存在,编译成.class文件就不存在了。

编译时注解:在源码和.class文件中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他们都属于编译时注解。

运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。像@Autowired自动注入的这样一种注解就属于运行时注解,它会在程序运行的时候把你的成员变量自动的注入进来。

3.2 按照来源划分:
【来自JDK的注解——来自第三方的注解——自定义注解】

3.3 元注解:
元注解是给注解进行注解,可以理解为注解的注解就是元注解。

四、自定义注解

4.1 自定义注解的语法要求

首先我们要明确这不是一个接口,它是使用@interface关键字定义的一个注解。
然后我们看下面的几个方法,String desc();虽然它很类似于接口里面的方法,其实它在注解里面只是一个成员变量(成员以无参无异常的方式声明),int age() default 18;(成员变量可以用default指定一个默认值的)。
最后我们要知道:
① 成员类型是受限制的,合法的类型包括基本的数据类型以及String,Class,Annotation,Enumeration等(例如:设为Map类型会报错)。
② 如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)。
③ 注解类可以没有成员,没有成员的注解称为标识注解。

部分实现代码:

    //自定义注解的使用(自己设置自定义注解所拥有的方法(值),相当于子类实现接口)
@NoMemberDecription //没有成员的注解,后面可以不带参数,也叫做标识注解
@OneMemberDecription("我只有一个String类型成员,我的成员名字必须设置为value()")
@Description(auther = "Mooc Boy", desc = "I am eyeColor",age=18) //我的成员多,需要在注解后自定义
public String eyeColor(){
return "red";
}

4.2 注解的注解(元注解)

上面代码中没有讲述的就是元注解

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented

下面详细介绍一下它们的作用

第一行:@Target是这个注解的作用域,ElementType.METHOD是这个注解的作用域的列表,METHOD是方法声明,除此之外,还有:
CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCAL VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口)

第二行:@Retention是它的生命周期,前面不是说注解按照运行机制有一个分类嘛,RUNTIME就是在运行时存在,可以通过反射读取。除此之外,还有:
SOURCE(只在源码显示,编译时丢弃),CLASS(编译时记录到class中,运行时忽略),RUNTIME(运行时存在,可以通过反射读取

第三行:@Inherited是一个标识性的元注解,它允许子注解继承它。(会继承父类的类注解,而不是方法注解)

第四行:@Documented,生成javadoc时会包含注解。

4.3 使用自定义注解

这里的Description是我们刚才在 自定义注解语法要求 里面定义的注解,然后我们可以给它的每一个成员变量赋值,注意数据类型。值得注意的是,因为我们前面定义的作用域是在方法和类接口上,所以这个注解在Color()方法上使用是没问题的。

4.4 解析注解

概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑

  4.4.1 为演示方便,定义只有一个String类型成员的注解

package myAnnountion;

import java.lang.annotation.*; //可根据自己需要引入,篇幅问题省略

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented public @interface OneMemberDecription { String value();
}

  4.4.2 将该自定义注解应用于类上

package myAnnountion;

    @OneMemberDecription("I am a class Annountion")  //类注解
public class Child implements Person { @Override
@OneMemberDecription("I am a method Annountion")//方法注解
public String name() {
// TODO Auto-generated method stub
return null;
} @Override
public int age() {
// TODO Auto-generated method stub
return 0;
} @Override
public void work() {
// TODO Auto-generated method stub
} }

  4.4.3 解析注解

package myAnnountion;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method; public class ParseAnn { public static void main(String[] args) {
//1.使用类加载器加载类
try {
Class clazz=Class.forName("myAnnountion.Child");
//2.找到类上面的注解
boolean isExist=clazz.isAnnotationPresent(OneMemberDecription.class);
if(isExist){
//3.拿到注解实例
OneMemberDecription omd=(OneMemberDecription)clazz.getAnnotation(OneMemberDecription.class);
System.out.println(omd.value());
} //4.找到方法上的注解
Method[] ms=clazz.getMethods();
//解析方法一
for(Method m:ms){
boolean isMExist=m.isAnnotationPresent(OneMemberDecription.class);
if(isMExist){
OneMemberDecription omd=(OneMemberDecription)m.getAnnotation(OneMemberDecription.class);
System.out.println(omd.value());
}
} //另外一种解析方法
for(Method m:ms){
Annotation[] as=m.getAnnotations();
for(Annotation a:as){
if(a instanceof OneMemberDecription){
OneMemberDecription omd=(OneMemberDecription)a;
System.out.println(omd.value());
}
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

结果:

可以看到方法注解解析了两遍,证明两种方法都可行。

 五、项目实现

抽空补上

主要参考慕课网:http://www.imooc.com/video/8870

&http://www.jianshu.com/u/10eec39371e0

Java注解总结的更多相关文章

  1. Java注解

    Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...

  2. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  3. Java注解入门

    注解的分类   按运行机制分:   源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...

  4. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

  5. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  6. attilax.java 注解的本质and 使用最佳实践(3)O7

    attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...

  7. paip.java 注解的详细使用代码

    paip.java 注解的详细使用代码 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  8. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  9. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  10. Java注解配置

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annota ...

随机推荐

  1. KD100遥控生成仪

    KD100是KEYDIY公司开发的一个强大的车用/民用遥控器生成工具,所生成的遥控器都具备不重码,质量稳定的特点. 通过采用英飞凌和NXP等公司开发的超级芯片,KD100巧妙的解决了各类型遥控器的兼容 ...

  2. C#:让您知道您的方法是被何“人”调用

    我们要在DisabledObsoleteMethod函数里限制具有“Obsolete”属性的方法调用,我们如何去做呢?在.Net中提供了一个"StackFrame"类用于表示当前线 ...

  3. python笔记6-%u60A0和\u60a0类似unicode解码

    前言 有时候从接口的返回值里面获取到的是类似"%u4E0A%u6D77%u60A0%u60A0"这种格式的编码,不是python里面的unicode编码. python里面的uni ...

  4. [翻译] JFDepthView 给view提供3D景深

    JFDepthView 给view提供3D景深 https://github.com/atljeremy/JFDepthView This is an iOS project for presenti ...

  5. C++keyword大总结

    register: 假设有一些变量使用频繁,则为存取变量的值少花一些时间, 能够将该局部变量的值放在CPU的寄存器中,须要时直接从寄存器 中取出參加运算,不必去内存中去存取. 由于寄存器的存取速度 远 ...

  6. iOS:沙盒、偏好设置、归档、解归档

    一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Ca ...

  7. windows安装dcm4chee 出错 check file system group LOSSY_STORAGE for deletion

    错误情景: 解决方法: 更改服务的监听端口(参考DICOM:Ubuntu14环境下安装dcm4chee+oviyam2.1)

  8. Glide Picasso Fresco UIL 图片框架 缓存 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. java学习笔记6--类的继承、Object类

    接着前面的学习: java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记 ...

  10. laravel5.1安装

    Laravel 于6月9日正式发布了 5.1 最新 LTS 版本.这是 Laravel 历史上第一个提供 LTS(长期支持 - long-time support) 支持的版本. 首先使用Larave ...