Java基础--注解
来源:互联网 发布:淘宝打造爆款团队 编辑:程序博客网 时间:2024/06/06 12:37
一、 什么是注解
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。通俗地讲,就是符合一定格式的语法。
作用:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
目前最主流的应用是代替配置文件。
优缺点:
开发效率高,成本低;
耦合性大,并且不利于后期维护。
二、基本内置注解
1. @Override
帮助开发人员检查是否正确覆盖了父类方法。JDK5表示覆写父类的方法,JDK6还可以表示实现接口的方法。
2. @Deprecated
表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用。
注:一般被标记过时的方法都存在不同的缺陷:安全问题、新的API取代。
3. @SuppressWarnings
表示抑制警告,被修饰的类或方法如果存在编译警告,将被编译器忽略。
deprecation 忽略过时
rawtypes 忽略类型安全
unused 忽略不使用
unchecked 忽略安全检查
null 忽略空指针
all 忽略所有
三、自定义注解
public @interface MyAnno{ //注解的属性 String value();}
注解内的属性类型只有以下几种:
String、基本类型、枚举类型、注解类型、Class类型、以上类型的一维数组类型
注解使用的注意事项:
(1)注解可以没有属性,如果有属性,需要使用小括号括住。如:@MyAnno @MyAnno()
(2)属性格式:属性名=属性值,多个属性使用逗号分隔。如@MyAnno(name=”ztq”, age=”18”)
(3)如果属性名为value,且当前只有一个属性,那么value可以省略
(4)如果使用多个属性时,k的名称为value不能省略
(5)如果属性类型为数组,设置内容格式为{1, 2, 3}。如:@MyAnno(arrs = {“lisa”, “Jack”})
(6)如果属性类型为数组,且元素只有一个时,{}可以省略
(7)一个对象上,注解只能使用一次,不能重复使用。
给类、方法等添加注解,如果需要在获得注解上设置的数据,那么我们就必须对注解进行解析,JDK提供java.lang.reflect.AnnotatedElement接口,允许在运行时通过反射获得注解。
元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)
JDK提供4种元注解:
(1)@Retention 用于确定被修饰的自定义注解的生命周期
- RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。用途:提供给编译器使用。
- RetentionPolicy.CLASS被修饰的注解只能存在于源码和字节码中,运行时内存中没有。用途:JVM使用。
- RetentionPolicy.RUNTIME被修饰的注解存在于源码、字节码、内存(运行时)中。用途:取代xml配置
(2)@Target 用于确定被修饰的自定义注解的使用位置
- ElementType.TYPE 修饰类、接口
- ElementType.CONSTRUCTOR 修饰构造
- ElementType.METHOD 修饰方法
- ElementType.FIELD 修饰字段
(3)@Documented 使用JavaDoc生成API文档时,包含此注解。
(4)@Inherited 如果父类使用被修饰的注解,子类继承。
定义注解:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MyAnno { String name(); int age() default 18;}
使用注解:
public class MyAnnoTest { @MyAnno(name = "ztq") public void show(){ System.out.println("show running!"); }}
解析注解:
public class MyAnnoParser { public static void main(String[] args) { /* 解析show方法上面的@MyAnno 主要目的就是获得show方法上的@MyAnno中的参数 */ //获得show方法的字节码对象 Class clazz = MyAnnoTest.class; try { Method method = clazz.getMethod("show", null); //获得show方法上的@MyAnno MyAnno annotation = method.getAnnotation(MyAnno.class); //获得注解的属性值 System.out.println(annotation.name()); //ztq System.out.println(annotation.age()); //18 } catch (NoSuchMethodException e) { e.printStackTrace(); } }}
- Java注解(1)-注解基础
- java基础-注解一-注解基础
- JAVA基础加强:注解
- java基础学习-注解
- java基础之注解
- Java基础:注解
- Java注解Annotation基础
- java注解基础
- Java基础 注解
- Java注解Annotation基础
- Java中的注解基础
- Java基础---注解
- 09.Java 基础 - 注解
- java注解基础
- Java注解Annotation基础
- java注解基础
- Java基础:注解
- java基础之注解
- 查找最小的k个元素(笔试题)
- 了解Java虚拟机 -JVM(每天学十页更新)
- golang设计模式(8)桥接模式
- 谈谈iOS7及以上版本navigationBar带来的坑
- java静态代理和动态代理
- Java基础--注解
- Ext3.1-createDelegate函数的委托
- Spark2.2 Driver和Executor状态改变处理机制源码分析
- python 生产者和消费者
- elasticsearch搭建及python简单使用
- CS224N笔记——第二讲——word vector representations,word2vec
- 虚拟机与Docker有何不同?
- ActiveMQ与mqtt.js的结合应用
- 1009.说反话-python