java注解的介绍、认识与基本使用

注解Annotation是什么(What)

Annotation是从JDK5.0开始引入的新技术
nnotation不是程序本身,可以对程序作出解释(这点和注释很像)
Annotation可以被其他程序(eg:编译器等)读取。
注解与注释最大的区别就是:注解信息处理流程

为什么要用注解(Why)

优点
1,开发速度快
2,编译期间容易发现错误的出处
缺点
1,管理分散,基本每个类上都有;
2,扩展功能时,没有遵循OCP开发原则。

注解在哪里用(Where)

可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

注解怎么用(How)

Annotation的格式:
注解是以“@注解名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”)。

注解分类

  • 内置注解

    **常用内置注解如下:**
    *@Override*  定义在java.lang.Override中,此注解只适用于修饰方法,表示一个方法声明打算重写父类中的另一个方法声明  

    *@Deprecated*  定义在java.lang.Deprecated中,此注解可用于修饰方法,属性,类表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择(引用时一般有删除线提示)  

    *@SuppressWarnings*  定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息  与前两个注解有所不同,需要添加一个参数才能正确使用,这些参数都是已经定义好的,可以自己选择。参数如下:

参数 说明
deprecation 使用了过时的类或方法的警告
unchecked 执行了未检查的转换时的警告,eg:使用集合时未指定泛型
fallthrough 当在switch语句使用时发生case穿透(忘写break)
path 在类路径、源文件路径等中有不存在路径的警告
serial 当在可序列化的类上缺少serialVersionUID定义时的警告
finally 任何finally子句不能完成时的警告
all 关于以上所有情况的警告

@SuppressWarnings("unchecked")

@SuppressWarnings(value={“unchecked”,“deprecation”})

示意图:

  • 元注解

元注解的作用就是负责注解其他注解。
Java定义了4个标准的meta-annotation类型:
@Target
@Retention
@Documented
@Inherited
这些类型和它们所支持的类都在java.lang.annotation包

@Target
 作用:用于描述注解的使用范围(被描述的注解可以用在什么地方)

所修饰的范围 取值 ElementType
package 包 ElementType.PACKAGE
类、接口、枚举、Annotation类型 ElementType.TYPE
方法 ElementType.METHOD
构造方法 ElementType.CONSTRUCTOR
成员变量 ElementType.FIELD
方法参数 ElementType.PARAMETER
局部变量 ElementType.LOCAL_VARIABLE

– @Target(value=ElementType.TYPE)

– @Target(value= {ElementType.METHOD,ElementType.TYPE})

@Retention
 作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期

取值 RetentionPolicy 作用
RetentionPolicy.SOURCE 在源文件中有效
RetentionPolicy.CLASS 在class文件中有效
RetentionPolicy.RUNTIME 在运行时有效(为RUNTIME可以被反射机制读取)

  @Retention(RetentionPolicy.RUNTIME)  

  示意图:

  • 自定义注解

    使用*@interface*自定义注解时, 自动继承了java.lang.annotation.Annotation接口

    示意图:



使用反射获取注解信息

使用注解完成类和表结构的映射关系,然后再使用反射读取注解信息。
ORM(Object Relationship Mapping)对象关系映射
类和表结构对应
属性和字段对应
对象和记录对应

代码实现如下:

package com.xyj.annotation;/*** 实体类 对应数据库的表* @author Administrator**/
@Table("studb")
public class Student {//属性 对应数据库的字段@Field(columnName="id",type="int",length=10)private int id;@Field(columnName="name",type="varchar",length=10)private String name;@Field(columnName="age",type="int",length=3)private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Student(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}public Student() {}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}}
package com.xyj.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 用来修饰类 表示数据库中的表*/
@Target(value= {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {String value();//表名}
package com.xyj.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 用来修饰属性 表示数据库中的字段*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Field {String columnName();//列名String type();//类型int length();//长度}
package com.xyj.annotation;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;/*** 使用反射读取注解的信息,模拟处理注解信息的流程*/
@SuppressWarnings("all")
public class Demo03 {public static void main(String[] args) {try {Class c=Class.forName("com.xyj.annotation.Student");//获取运行类//获取该类使用的注解Annotation[] annotations = c.getAnnotations();for (Annotation a : annotations) {System.out.println(a);}//获取类的指定的注解Table t=(Table) c.getAnnotation(Table.class);//通过注解.class 获取指定注解System.out.println(t.value());//获得类的属性的注解Field f = c.getDeclaredField("name");com.xyj.annotation.Field f2 = f.getAnnotation(com.xyj.annotation.Field.class);//这里写包名的原因是Field和别的包中的类重名啦System.out.println(f2.columnName()+"--"+f2.type()+"--"+f2.length());} catch (Exception e) {e.printStackTrace();}}
}

Java注解(Annotation)相关推荐

  1. Java注解(Annotation)详解

    转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...

  2. Java注解Annotation 完成验证

    Java注解Annotation用起来很方便,也越来越流行,由于其简单.简练且易于使用等特点,很多开发工具都提供了注解功能,不好的地方就是代码入侵比较严重,所以使用的时候要有一定的选择性. 这篇文章将 ...

  3. java注释和注解_深入理解JAVA注解(Annotation)以及自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.Java 语言中的类.方法.变量.参数和包等都可以被标注.注解可以看作是一种特殊的标记,在程序在编译或 ...

  4. java 注解: Annotation

    java 注解: Annotation 普通注解 自定义注解 元注解 注解: 位于源码中,用来修饰程序的元素,但不会对被修饰的对象有直接的影响. 可增加程序的动态性. 普通注解 普通注解:为java代 ...

  5. Java注解annotation invalid type of annotation member

    文章目录 Java注解annotation : invalid type of annotation member 1.什么是invalid type of annotation member 2.哪 ...

  6. Java 注解(Annotation)使用方法归纳

    Java注解Annotation使用方法归纳 简介 注解是从JDK5开始支持,是Java对元数据的一种特殊支持.与注释有一定区别,可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等 ...

  7. 深入理解Java注解Annotation之注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  8. 深入理解Java注解Annotation及自定义注解

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  9. Java注解Annotation详解

    注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去 ...

  10. Java 注解 Annotation

    概述 了解 Java 注解前必须先了解元注解. 元注解:描述注解的注解. 如果明白元数据概念就比较好理解元注解 元数据:描述数据的数据. 还是比较抽象哈,下面举个例子说明下. 比如一个txt文件的元数 ...

最新文章

  1. spring boot2.x使用rabbitmq
  2. 开闭操作进行平滑处理与边缘提取
  3. sqlserver查看索引_SQL Server页中行物理存储
  4. 实战:Redis哨兵模式(上)
  5. 电脑故障,路由器及网络
  6. 关于flex布局学习分享
  7. phpstorm,webstorm取消自动保存并标识修改的文件为星星标记
  8. 文本处理命令系列——cut
  9. 去中心化交易所如雨后春笋,EOS交易所崭露头角
  10. Spring框架---全面详解【无比详细,学习总结】
  11. 现在国内程序员的工资是什么行情?
  12. shell基础--正则表达式行列提取
  13. 辨析NOR FLASH地址左右移的问题
  14. 2.4G SOC芯片CI2451/CI2454应用于遥控玩具汽车的应用方案
  15. HBuilder打包iOS教程
  16. 建网站论坛需要多大服务器,论坛搭建如何选择服务器
  17. Modbus的常见问题解答:多台设备如何连接?为什么要加终端电阻?RS485总线可挂接多少个设备?在RS485通讯中,最大传输距离是多少?
  18. linux使分区生效,Linux 硬盘分区生效命令partprobe
  19. 现实环境中,关于Teb Local Planner 参数调试总结
  20. 《我想进大厂》之Dubbo普普通通9问

热门文章

  1. 7月份火爆Github的热门Python项目
  2. maxwell采集mysql binlog 日志数据到kafka topic
  3. 基于android的校园新闻app,移动端校园新闻APP的设计探析
  4. ~囍~ Evening Star 篇
  5. 量化投资之工具篇一:Backtrader从入门到精通(5)-Strategy类源代码解读
  6. ML-Agents 安装配置 【ML-Agents 官方文档翻译(ML-Agent 1.9.1,Unity 2018-2020)】
  7. 小米5.0以上设备最完美激活xposed框架的流程
  8. 内存颗粒位宽和容量_【科普】内存颗粒版本判断方法和编号解析V2.0
  9. 【前端开发】:行间距和首行缩进
  10. ArchLinux Plasma 简洁优雅桌面环境设置