Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
——————————————————————————————————————————
使用注解可以使用更少的代码完成同样的事情,并且有更好的编译时错误检测机制. 注解的目的是花更少的时间在那些死硬无用的细节中,更多地关注业务逻辑规则.【源】
——————————————————————————————————————————
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记;JAVAC编译器、开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,有什么标记,就去干相应的事。
元注解:
target元注解:
用于描述注解的使用范围,用在什么地方
取值:
- 1.CONSTRUCTOR:用于描述构造器
- 2.FIELD:用于描述域
- 3.LOCAL_VARIABLE:用于描述局部变量
- 4.METHOD:用于描述方法
- 5.PACKAGE:用于描述包
- 6.PARAMETER:用于描述参数
- 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
Retention:
被描述的注解在哪一个级别上可用:源代码Source、类文件class、运行时RUntime
取值:
- 1.SOURCE:在源文件中有效,注解的信息只会留在源文件中,注解的信息会被编译器抛弃,不会留在class文件中;
- 2.CLASS:在class文件中有效,表示注解的信息当程序编译时被保留在class文件(字节码文件),但在运行的时候不会被虚拟机读取;
- 3.RUNTIME:在运行时有效,表示注解的信息当程序编译时被保留在class文件(字节码文件)中,在运行时会被虚拟机保留以便通过反射读取到;
Documented:
给类、方法添加注释;此注解会被javadoc工具提取成文档,在doc文档中的内容会因为此注解的信息内容不同而不同
Inherited:是否允许子类继承该注解
如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类
- 资料1、 @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的;如果一个子类想获取到父类上的注解信息,那么必须在父类上使用的注解上面 加上@Inherit关键字;
- 资料2、完整语法:inherited XXX(ParamList);
上面的语法表示调用父类的方法XXX, ParamList是参数列表
如果直接使用inherited,没有指定方法名和参数,那么就会调用父类的同名方法
实例:
这里写代码片,然而我不知道写什么
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。
如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。源
自定义注解 源
- Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,不能再去继承别的类或是接口.
- 参数成员只能用public或默认(default)这两个访问权修饰
- 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
- 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法 5. 注解也可以没有定义成员, 不过这样注解就没啥用了
PS:自定义注解需要使用到元注解
如下:interface声明一个注解
- 其中的每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称,返回值类型就是参数的类型
- public @interface 注解名 {定义体}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InterfaceApple {
String value() default "";//如果只有一个参数成员,最好把参数名称设为"value",后加小括号
//颜色枚举
public enum Color{ BULE,RED,GREEN};
//颜色属性
Color fruitColor() default Color.GREEN;
//注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定
public int id() default -1;//供应商编号
public String name() default "";//供应商名称
public String address() default "";//供应商地址
}
Pulbic class Apple(){
@InterfaceApple("Apple")
private String appleName;
//方法的名称就是参数的名称
@InterfaceApple(fruitColor = InterfaceApple.Color.RED)
private String appleColor;
@InterfaceApple(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
private String appleProvider;
@MyAnnotation("hello")
@MyAnnotation("world")
public void show(@MyAnnotation("ABC") String string){}
}
其他注解:
* 注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时
* 注解@SuppressWarnings用来压制程序中出来的警告
链接有点多,有些重复的:
Java注解之Retention、Documented、Target介绍 L明
Annotation深入研究——@Documented注释使用 KylinStayHere
http://latty.iteye.com/blog/2371766 解注解中的@Inherited latty
深入理解Java:注解(Annotation)–注解处理器 web之家 这个博客里面有一张导图,感觉上传到我这个鱼龙混杂的博客有点不太好