java 注解总结(浅层)
目录
注解作用
注解,是给java编译器看的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。(百度百科)
java基本注解
@Override
当子类重写父类方法时,子类可以加上这个注解,
验证下面的方法名,是否是父类中所有的,
如果没有则报错。
确保子类确实重写了父类的方法
@Deprecated
用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线)。
该注解支持since、forRemoval两个属性:
forRemoval - 指示注释的元素是否在将来的版本中被删除。默认值是false。
since -返回注释元素已过时的版本。 默认值是空字符串。
@SuppressWarnings
告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。可以标注在类、字段、方法、参数、构造方法,以及局部变量上。
被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告。
使用方式:
@SuppressWarnings(“”)
@SuppressWarnings({})
@SuppressWarnings(value={})
@SafeVarargs
堆污染:把不带泛型的对象赋给一个带泛型的对象。eg:
List list = new ArrayList();
list.add(20);
List<String> ls = list;
System.out.println(ls.get(0));
则会抛出堆污染异常
@SafeVarargs修饰引发该警告的方法或构造器,可抑制这个警告。
@Functionallnterface
只能修饰接口。保证这个接口只有一个抽象方法。
只能作用于“函数式接口定义”。
“函数式接口定义”指仅仅包含一个抽象方法的接口,具体定义如下:
1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
例如:
@FunctionalInterface public interface TestInterface { // 抽象方法
public void sub();
// java.lang.Object中的方法不是抽象方法
public boolean equals(Object var1);
// default不是抽象方法
public default void defaultMethod(){ }
// static不是抽象方法
public static void staticMethod(){ }
自定义注解
自定义注解使用的基本流程:
第一步,定义注解——相当于定义标记;
第二步,配置注解——把标记打在需要用到的程序代码中;
第三步,解析注解——在编译期或运行时检测到标记,并进行特殊操作。
定义注解
先看一个例子:定义@CherryAnnotation
public @interface CherryAnnotation {
public String name();
int age() default 18;
int[] array();
}
- 注解中的成员变量以方法的方式来定义。()不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅只是一个特殊的语法。
- 当使用自定义注解的时候,这个注解本身是不会生效的,必须由开发者工具提取出来并进行处理。
- 指定完默认值的时候,可以直接@注解使用不需要带参数。
default代表默认值。 - 访问修饰符必须为public
- 该元素的名称一般定义为名词,如果注解中只有一个元素,请把名字起为value(如果一个注解内仅仅只有一个名字为 value 的属性时,应用这个注解时可以直接接属性值填写到括号内。);
- 该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型(体现了注解的嵌套效果)以及上述类型的一位数组.
元注解
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。(可用于自定义注解)
几种元注解
- @Target
用于描述注解的使用范围
public enum ElementType {
/** 类,接口(包括注解类型)或枚举的声明 */
TYPE,
/** 属性的声明 */
FIELD,
/** 方法的声明 */
METHOD,
/** 方法形式参数声明 */
PARAMETER,
/** 构造方法的声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包的声明 */
PACKAGE
}
举例:
@Target(value = {ElementType.TYPE,ElementType.METHOD})
public @interface CherryAnnotation {
String name();
int age() default 18;
int[] array();
}
- @Retention
修饰自定义注解的生命力
注解的生命周期有三个阶段:
1、Java源文件阶段;
2、编译到class文件阶段;
3、运行期阶段。
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
* (注解将被编译器忽略掉)
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
* (注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为)
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
* (注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到)
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
-
@Documented
能够将注解中的元素包含到 Javadoc 中去 -
@Inherited
指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。举例:
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。
- @Repeatable
注解的值可以同时取多个。举例如下:
@interface Persons {
Person[] value();
}
@Repeatable(Persons.class)
@interface Person{
String role default "";
}
@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{
}
Persons 是一张总的标签,上面贴满了 Person 这种同类型但内容不一样的标签。把 Persons 给一个 SuperMan 贴上,相当于同时给他贴了程序员、产品经理、画家的标签。
转载自:
元注解:
https://blog.csdn.net/briblue/article/details/73824058
基本注解:
https://blog.csdn.net/aliceeve_rosemary/article/details/79982535
https://baike.baidu.com/item/注解/22344968
自定义注解:
https://blog.csdn.net/xsp_happyboy/article/details/80987484
本文深入浅出地介绍了Java注解的使用,涵盖了基本注解如@Override、@Deprecated、@SuppressWarnings等的功能与应用场景,以及自定义注解的创建过程。同时,文章详细解释了元注解的作用,包括@Target、@Retention、@Documented、@Inherited和@Repeatable的用法。
&spm=1001.2101.3001.5002&articleId=94394991&d=1&t=3&u=acbabbdcc36b4b96bfcb2db2f12bb00c)
1513

被折叠的 条评论
为什么被折叠?



