《菜鸟反攻战》第一章----java注解
2017-07-13 21:10
337 查看
《菜鸟反攻战》第一章----java注解
一、什么是注解?为什么使用注解?
元数据:用来描述数据的数据,具体指代的就是代码间的关系、或者代码与其他资源(比如数据库表)之间内在联系的数据,java注解就是元数据,在以前的版本中描述数据是使用xml文件进行描述,代码与描述文件耦合性较低,不利于维护,于是程序员就开始使用注解来对源代码进行注释。java注解在运行时有专门的工具进行处理,其存在不影响源代码的编译,去除注解后代码可以正常运行。
二、java注解的分类
1、根据使用方法分为:JAVA内置注解:即JDK已经定义好的注解,在使用时具有特定的含义,比如@Override用于表示子类重写父类的方法;
自定义注解:程序员自己通过元注解(后面讲解)来定义的为特定功能显示使用的注解,即DIY注解。
2、根据成员变量个数分为:
标记注解:定义的注解中没有成员变量(参数):
public @interface Test{}//定义此注解时省略了元注解,这个语句定义了注解@Test,注解内部没有任何参数,即为标记注解
元数据注解:注解内部包含成员变量(参数):
public @interface Test{//定义注解时省略了元注解
public String value() default "";//注解内部的方法就是注解的参数,该注解定义时含有参数,即为元数据注解
}
三、注解说明
1、注解用于修饰源代码,不会影响源代码的编译及运行,去掉注解对源代码的运行没有影响,注解可以提供源代码的检查,比如@Override注解标注一个方法时,如果该类没有重写父类的该类或者父类中不存在该类,系统编译时会报错,这只是为代码的编译运行提供高效,并不是影响代码的作用,去除该注解后,源代码进行编译同样会报错(注解是提供程序员快速找到错误的原因并进行修复的功能)。2、注解内部均是以方法形式存在,一个方法就代表一个参数,也可以定义无参注解,当注解内部只有一个参数,且该参数的名称为value时,使用注解进行赋值可以省略参数名,例如自定义一个参数:
public @interface Test{//定义注解时省略了元注解
public String value() default "";//该注解只含有一个参数,且该参数的名称为value
}
在使用该参数时可以省略省略参数名:
@Test(value="aa") //此语句相当于@Test("a"),可以省略参数名
public void info(){}
3、定义注解时可以使用default来对数据进行初始化,在使用时如果没有对参数进行赋值,系统将会使用定义注解时初始化的值。
4、注解本身没有进行任何的逻辑处理,而是通过反射调用逻辑处理类,扫描含有该注解的内容,进行逻辑处理。
四、注解的运行原理
1、定义注解2、在源代码中使用该注解
3、jvm通过API反射,获取注解标注的属性值,并进行逻辑处理
五、JAVA内置注解
java内置注解使用比较多的有三个:@Override:指定子类必须重写父类方法,当子类没有重写父类方法、方法名与父类不相同、父类没有该方法时均会报错:
例如:
//定义一个父类
class Father{
public void info(){
System.out.println("我是父类的方法");
}
}
//定义一个子类继承Father类
public class Sun extends Father{
@Override
public void info(){//如果该方法没有重写父类的方法或者方法名输入错误,系统会显示错误
System.out.println("我是子类,我重写了父类的方法");
}
}
@Deprecated 标记该方法已经过时,不建议使用,如果标记过的方法在代码中被使用,系统会出现警告:
//在一个类中定义了该方法不建议使用
public classTest{
@Deprecated
public void info(){}
public static void main(String[] args){
new Test().info();//info方法标记过时,在主方法中使用标记的方法,系统会出现警告
}
}
@SuppressWarnings:取消系统的警告,参数不一一列举
@SuppressWarnings(value="unchecked")
public class Test{
int a=(int)22.3;//标注之后系统会取消警告信息
}
六、自定义注解
元注解:定义注解的注解,要自定义注解时通过元注解来对注解进行描述1、@Target:用于描述注解的使用范围:
(ElementType)有:
1)CONSTRUCTOR:用于描述构造器
2)FIELD:用于描述域(类的成员变量)
3)LOCAL_VARIABLE:用于描述局部变量
4)METHOD:用于描述方法
5)PACKAGE:用于描述包
6)PARAMETER:用于描述参数
7)TYPE:用于描述类、接口(包括注解类型)或枚举声明
2、@Retention:表示需要在什么级别保存该注解信息,描述注解的生命周期
(RetentionPolicy)有:
1)SOURCE:在源文件中有效
2)CLASS:在class文件中有效
3)RUNTIME:在运行时有效,注解处理器可以通过反射获取到注解的属性进行逻辑处理,使用比较广泛
3、@Documented:描述此注解是否可以在javadoc命令下形成doc文档
4、@Inherited:描述该注解具有继承性,使用该注解的类的子类也自动使用该注解
例子:
//定义注解类
package Annotation; import java.lang.annotation.*; /** * 定义一个自定义注解,该注解用于标注颜色 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Test { public String color() default ""; }
//定义注解使用类
package Annotation; public class MainTest { @Test(color="red") private String color; public String getColor(){ return color; } public void setColor(String color){ this.color=color; } }
//注解处理器
package Annotation; import java.lang.reflect.*; public class AnnotationInfo { public static void getInfo(Class<?> clazz){ String nn="颜色为:"; Field[] field=clazz.getDeclaredFields(); for(Field fields:field){ Test color=(Test)fields.getAnnotation(Test.class); nn=nn+color.color().toString(); System.out.println(nn); } } }
//运行注解
package Annotation; public class AnnotationRun { public static void main(String[] args){ AnnotationInfo.getInfo(MainTest.class); } }
运行结果为:
所有的内容是本菜鸟通过查阅网上资料及查看相关书籍,顺带加上自己那不成熟的理解,希望给自己做一个记录,同时希望可以一点一点慢慢开始理解更深刻,弥补现在的不足。
相关文章推荐
- 第一章Java简介
- Java语言入门 -- 第一章 Java的产生与特点
- java annocation(注解)
- 在EasyDBO中使用Java注解配置映射的原理及使用
- Java的String经典笔试题付注解
- 在EasyDBO中使用Java注解配置映射的原理及使用
- 第一章--java web应用程序概述
- 在EasyDBO中使用Java注解配置映射的原理及使用
- 在EasyDBO中使用Java注解配置映射的原理及使用
- 【学习笔记】Thinking in java (第三版)第一章 对象的介绍(Introduction to objects)
- 第一章: 了解JAVA
- java6的@override注解与java5的不同之处
- java annocation(注解)
- Java 程序设计语言(第四版)读书笔记 第一章 快速浏览
- Java2实用教程(第二版)程序代码——第一章 Java语言入门
- 第一章 Java GUI的发展和演化
- 在EasyDBO中使用Java注解配置映射的原理及使用
- SCA的java注解和API规范v100
- JAVA基础学习篇----《thinking in java》第一章:对象简介
- Java的String经典笔试题付注解