1,JAVA 注解
注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。
个人理解:根据注解自动运行对应代码,编译时,根据注解进行操作或者提示,进一步看spring框架中注解
1,内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是
- @Override: 只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
- @Deprecated: 建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
- @SuppressWarnings: 这一个类型可以来暂时把一些警告信息消息关闭.
作用在其他注解的注解(或者说 元注解)是:
- @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。
- @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
从 Java 7 开始,额外添加了 3 个注解:
- @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次
常用注解:
@Deprecated -- @Deprecated 所标注内容,不再被建议使用。
@Override -- @Override 只能标注方法,表示该方法覆盖父类中的方法。
@Documented -- @Documented 所标注内容,可以出现在javadoc中。
@Inherited -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
@Retention -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。
@Target -- @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。
@SuppressWarnings -- @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。
2,Annotation 结构
Annotation就是个接口
- ElementType 指定注解应用于哪一种元素:
-
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
- RetenPolicy 每个注释只有一种策略:
-
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */
CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
3,注解作用
-
编译检查:
例如,@SuppressWarnings, @Deprecated 和 @Override 都具有编译检查作用
class override {
/*
测试override
*/
@Override
public String toString()
{
return "该方法覆盖于父类";
}
public String getString()
{
return "该方法没有曾被声明过,不能被@Override 修饰";
}
public static void main(String[] args) {
}
}
- 在反射中使用 Annotation
在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口。
这也意味着,我们可以在反射中解析并使用 Annotation
//自定义注解实现一个sql语句的拼接
/**
*自定义注解一般可以分为三步: 定义注解,使用注解,读取注解
*
/
//定义注解
package test;
import java.lang.annotation.*;
@Documented
@Target({ElementType.TYPE, ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaion {
String getValue() default "this is myAnntaion";
int order() default 0;
}
//使用注解
package test;// 将自定义的注解加在用户上,实现一个表的映
@MyAnnotaion(getValue = "annotation on class")
public class Demo {
@MyAnnotaion(getValue = "annotation on filed")
public String name;
@MyAnnotaion(getValue = "annotation on method")
public void hello(){
}
@MyAnnotaion
public void defaultMethod(){
}
}
//使用反射查看注解
package test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestDemo {
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
/**
* 获取类上的注解
*/
Class<Demo> demoClass = Demo.class;
Annotation[] annotaion = demoClass.getAnnotations();
printAnnotation(annotaion);
/**
* 读取成员变量上的注解
*/
Field name = demoClass.getField("name");
Annotation[] getOnFiled = name.getAnnotations();
printAnnotation(getOnFiled);
/**
* 读取方法上的注解
*/
Method hello = demoClass.getMethod("hello", null);
MyAnnotaion onMethod = hello.getAnnotation(MyAnnotaion.class);
System.out.println(onMethod.getValue());
/**
* 获取默认方法上的注解
*/
Method defaultMethod = demoClass.getMethod("defaultMethod", null);
MyAnnotaion onDefaultMethod = defaultMethod.getAnnotation(MyAnnotaion.class);
System.out.println(onDefaultMethod.getValue());
}
public static void printAnnotation(Annotation... annotations) {
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
}
}
/*
结果
@test.MyAnnotaion(getValue="annotation on class", order=0)
@test.MyAnnotaion(getValue="annotation on filed", order=0)
annotation on method
this is myAnntaion
/
- 根据 Annotation 生成帮助文档
通过给 Annotation 注解加上 @Documented 标签,能使该 Annotation 标签出现在 javadoc 中。
- 能够帮忙查看查看代码
通过 @Override, @Deprecated 等,我们能很方便的了解程序的大致结构。另外,我们也可以通过自定义 Annotation 来实现一些功能。
本次学习:
- 每个Java只能有一个public类,可使用内部类
- java IEDA 与其他编译的区别 ,多个模块的概念
4,注解与注释的区别
可以被其他程序(比如:编译器等)读取。(注解信息处理流程,是注解和注释的重大区别,如果没有注解信息处理流程,则注解毫无意义)
注解在编译时,可进行对于操作
①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查
注解可以附加在 package,class,method,field 等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素的访问。
2,参考:
(177条消息) Java注释和注解的区别_赵广陆的博客-优快云博客_java注释和注解的区别
Java 注解(Annotation) | 菜鸟教程 (runoob.com)
(177条消息) Java 注解的作用与使用_记忆力不好的博客-优快云博客
[java注解的使用 - chenweicool - 博客园 (cnblogs.com)](https://www.cnblogs.com/chentang/p/13959831.html#:~:text=Java注解是附加在代码中的一些元信息,用于编译和运行时进行解析和使用,起到说明、配置的功能。 注解不会影响代码的实际逻辑,仅仅起到辅助性的作用。 包含在java.lang.annotation包中。,注解的定义类似于接口的定义,使用%40interface来定义,定义一个方法即为注解类型定义了一个元素,方法的声明不允许有参数或throw语句,返回值类型被限定为原始数据类型、字符串String、Class、enums、注解类型,或前面这些的数组,方法可以有默认值。 注解并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。 它会反过来对正在运行的程序语义有所影响。 注解可以从源文件、class文件或者在运行时通过反射机制多种方式被读取。)
推荐: