Java注解介绍
来源:互联网 发布:sql字符串截取 汉字 编辑:程序博客网 时间:2024/06/07 13:52
一、什么是注解--概念
二、JDK内置注解
JavaSE中内置了三个标准注解,都是定义在java.lang中,它们是:
- @Override:用于修饰子类的方法覆盖了父类中的方法;
- @Deprecated:用于修饰已经过时了的方法,不推荐使用的方法;
- @SuppressWarnnings:告诉java编译器禁止编译警告。
@Override很简单,只是一个标记,用于标注一个方法。它表示,被它标注的方法覆盖了父类的方法。如果一不小心,子类的方法名写错了,有了@Override之后,编译时会报错。也就是说被@Override标注的方法如果没有覆盖父类的方法,编译时报错。
@SuppressWarnings有一些参数用于表示特定的警告:
- deprecation:不要给出“不赞成使用的类或方法的警告”;
- unchecked:不要给出“类型转换时警告”;
- fallthrough:不要给出”switch语句块没有break的警告”;
- path:不要给出“不存在的路径”的警告;
- serial:不要给出“可序列化类缺少serialVersionUID”的警告;
- finally:不要给出“finally语句块不能正常完成”的警告;
- all:不要给出以上所有情况的警告。
三、元注解
2.@Retention,
3.@Documented,
3.1 @Target
@Target用来说明自定义注解可以用在什么地方,其ElementType取值有:1. CONSTRUCTOR:用于描述构造器2. FIELD:用于描述域3. LOCAL_VARIABLE:用于描述局部变量4. METHOD:用于描述方法5. PACKAGE:用于描述包6. PARAMETER:用于描述参数7. TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Target(ElementType.TYPE)public @interface Table { /** * 数据表名称注解,默认值为类名称 * @return */ public String tableName() default "className";}@Target(ElementType.FIELD)public @interface NoDBColumn {}
3.2 @Retention
@Retention用于表示自定义注解可以被javadoc之类的工具文档化,没有成员。取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false;}
3.3 @Documented
@Documented用于表示自定义注解可以被javadoc之类的工具文档化,没有成员。@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false;}
3.4 @Inherited
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
@Inheritedpublic @interface Greeting { public enum FontColor{ BULE,RED,GREEN}; String name(); FontColor fontColor() default FontColor.GREEN;}
四、自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
简单的自定义注解和使用注解实例:
package annotation;import java.lang.annotation.Documented;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)@Documentedpublic @interface FruitName { String value() default "";}
package annotation;import java.lang.annotation.Documented;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)@Documentedpublic @interface FruitColor { /** * 颜色枚举 * @author peida * */ public enum Color{ BULE,RED,GREEN}; /** * 颜色属性 * @return */ Color fruitColor() default Color.GREEN;}
package annotation;import annotation.FruitColor.Color;public class Apple { @FruitName("Apple") private String appleName; @FruitColor(fruitColor=Color.RED) private String appleColor; public void setAppleColor(String appleColor) { this.appleColor = appleColor; } public String getAppleColor() { return appleColor; } public void setAppleName(String appleName) { this.appleName = appleName; } public String getAppleName() { return appleName; } public void displayName(){ System.out.println("水果的名字是:苹果"); }}
注解元素的默认值:
注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。
package annotation;import java.lang.annotation.Documented;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)@Documentedpublic @interface FruitProvider { /** * 供应商编号 * @return */ public int id() default -1; /** * 供应商名称 * @return */ public String name() default ""; /** * 供应商地址 * @return */ public String address() default "";}
- Java 注解(Annotation)介绍
- Java注解介绍
- Java注解简单介绍
- JAVA 注解的介绍
- Java注解简单介绍
- Java注解入门介绍
- Java注解的介绍
- java 注解介绍
- Java 注解 详细介绍
- JAVA注解Annotation介绍
- Java中注解介绍
- Java注解介绍
- java注解介绍和自定义注解实例
- java--注解简单介绍及自定义注解
- Java 之 Annotation(注解)介绍
- Java注解Annotation介绍 @interface
- java的注解技术介绍
- Java注解(Annotation)介绍
- HNOI2017 spaly题解
- SSM+R之MyBatis基础问答
- 第26章 编写应用程序交叉编译
- Mybatis_HelloWord
- app适配js
- Java注解介绍
- Python+pandas实现时间序列数据扩展案例一则
- AutoCAD .Net 创建点Point
- 从今天开始,每天花1小时学习Python,附电子书
- RocketMq命令
- AutoCAD .Net 创建填充Hatch
- Spring-framework-core-1.3
- jquey.extend深拷贝
- 最长不下降字序列