java注解

来源:互联网 发布:广州汇丰软件 编辑:程序博客网 时间:2024/05/22 12:40

JDK自带注解

@Override,@Deprecated,@Suppvisewarnings@Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。@Deprecated,修饰过时的方法。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。@Suppvisewarnings,关闭不当的编译器警告信息@Override 表示这个方法是重写的@Deprected 表示指示的程序元素是不赞成程序员使用的,如果程序元素被使用,则会有警告。@Suppvisewarnigs 表示忽略程序元素的警告 比如@Suppvisewarnings(“deprected”) 或者@Suppvisewarnings(value={"",""}) @Suppvisewarnings({})
@·常见第三方注解Spring---@Autowired 可以自动生成DAO的实例注入进去@Service@RepositoryMybatis---@InsertProvider@UpdateProvider@Options

注解的分类
1、按照运行机制分
源码注解:注解只在源码中存在,编译成.class文件就不存在了
编译时注解:注解在源码和.class文件中都存在(如:JDK内置系统注解)
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解(如:Spring中@Autowried)

2、按照来源分
JDK内置系统注解、原注解、自定义注解、第三方注解

自定义注解的语法要求:

1.使用@interface关键字定义注解
2.成员以无参,无异常的方式声明
3.可以用default为成员制定一个默认值
4.声明成员的类型只能包括:基础数据类型、String、Class、Annotation、Enumeration
5.如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
6.注解类可以没有成员,没有成员的注解称为标识注解

@元注解—注解的注解
@target—注解的作用域—-几乎包含了java中所有元素
constructor(构造方法声明),
field(字段声明),
local_variable(局部变量声明),
method(方法声明),
package(包声明),
parameter(参数声明),
type(类,接口声明))

@Retention-生命周期
1.SOURCE –>源码上,编译时会丢失
2.CLASS –> 编译时会记录在class上,运行时会丢失
3.RUNTIME –>运行时存在,可以通过反射读取

@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
告诉我们允许子注解来继承它

@Inherited允许子类继承,标识性注解

@元注解–document–生成Javadoc
导出生成的Javadoc文件–Export->java->Javadoc选择导出的路径–>打开文件在浏览器中浏览

@·使用自定义注解
使用注解的语法
@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,…)

–解析注解:
概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
@Inherited(子类是否可继承) 对接口interface、方法继承没有作用,对类才有效。
通过反射回去类,函数或成员以上的运行时的注解信息从而实现动态控制程序运行的逻辑

【解析注解代码】
//1.使用类加载器加载类

try {Class c = Class.forName("com.ann.test.Child");//2.找到类上的注解boolean isExist = c.isAnnotationPresent(Description.class);if(isExist){//3.拿到注解实例Description d = (Description)c.getAnnotation(Description.class);System.out.println(d.value());}//4.找到方法上的注解Method[] ms = c.getMethods();for(Method m:ms){boolean isMExist = m.isAnnotationPresent(Description.class);if(isMExist){Description d = m.getAnnotation(Description.class);System.out.println(d.value());}}//另外一种解析方法for(Method m:ms){Annotation[] as = m.getAnnotations();for(Annotation a:as){if(a instanceof Description){Description d = (Description)a;System.out.println(d.value());}}}} catch (ClassNotFoundException e) {e.printStackTrace();}}

【注解Retention不同值得影响】
只有为RUNTIME运行时注解才能获取得到

自定义注解——语法要求
1:使用@interface关键字定义注解
2:成员方法以午餐无异常的方式声明
3:可以使用default为成员方法指定一个默认值
4:成员的类型是有限制的,合法的成员类型包括原始类型/String/Class/Annotation/Enumeration
5:如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
6:注解类可以没有成员,没有成员的注解成为标识注解自定义主机——语法要求
1:使用@interface关键字定义注解
2:成员方法以午餐无异常的方式声明
3:可以使用default为成员方法指定一个默认值
4:成员的类型是有限制的,合法的成员类型包括原始类型/String/Class/Annotation/Enumeration
5:如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
6:注解类可以没有成员,没有成员的注解成为标识注解

自定义注解是元注解的类型和作用:
1:@Target表明注解的作用域
2:@Retention表明注解的生命周期
3:@Inherited表明注解的允许子类继承
4:@Documented表明生成javadoc时会包含注解的信息

注解解析的关键是 JAVA反射机制的使用,有关Class/Method/Field的API需要好好补充

0 0
原创粉丝点击