java注解自定义使用
2021-07-03 20:07
标签:eve move 它的 not 复杂 生成 public ted least Java提供了4种注解,专门负责新注解的创建: @Target: 表示该注解可以用于什么地方,可能的ElementType参数有: @Retention 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括: @Document 将注解包含在Javadoc中 @Inherited 允许子类继承父类中的注解 开发实例: UseCase.java PasswordUtils.java UseCaseTest.java 运行结果: 总结: java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 java自定义注解和运行时靠反射获取注解。 其它: java注解自定义使用 标签:eve move 它的 not 复杂 生成 public ted least 原文地址:https://www.cnblogs.com/UniqueColor/p/9618391.html
CONSTRUCTOR
:构造器的声明FIELD
:域声明(包括enum
实例)LOCAL_VARIABLE
:局部变量声明METHOD
:方法声明PACKAGE
:包声明PARAMETER
:参数声明TYPE
:类、接口(包括注解类型)或enum
声明
SOURCE
:注解将被编译器丢弃CLASS
:注解在class文件中可用,但会被VM丢弃RUNTIME
:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
1 package com.example.demo.annotation;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Retention;
5 import java.lang.annotation.RetentionPolicy;
6 import java.lang.annotation.Target;
7
8 @Target(ElementType.METHOD)
9 @Retention(RetentionPolicy.RUNTIME)
10 public @interface UseCase {
11
12 public String id();
13
14 public String description() default "no description";
15 }
1 package com.example.demo.test;
2
3 import com.example.demo.annotation.UseCase;
4
5 public class PasswordUtils {
6
7 @UseCase(id = "1", description="Passwords must contain at least one numeric")
8 public boolean validatePassword(String password) {
9 return (password.matches("\\w*\\d\\w*"));
10 }
11
12 @UseCase(id = "2")
13 public String encryptPassword(String password) {
14 return new StringBuilder(password).reverse().toString();
15 }
16 }
1 package com.example.demo.test;
2
3 import com.example.demo.annotation.UseCase;
4
5 import java.lang.reflect.Method;
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.List;
9
10 public class UseCaseTest {
11
12 public static void main(String[] args) {
13
14 List
1 Found Use Case:1 Passwords must contain at least one numeric
2 Found Use Case:2 no description
3 Warning: Missing use case-3
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中1、Annotation的工作原理:
JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。
Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。
Annotation可以冲源文件、class文件或者在运行时通过反射机制多种方式被读取。
2、@Override注解:
java.lang
注释类型 Override
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override
表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
@Override注解表示子类要重写父类的对应方法。
Override是一个Marker annotation,用于标识的Annotation,Annotation名称本身表示了要给工具程序的信息。
下面是一个使用@Override注解的例子:
class A {
private String id;
A(String id){
this.id = id;
}
@Override
public String toString() {
return id;
}
}
3、@Deprecated注解:
java.lang
注释类型 Deprecated
@Documented
@Retention(value=RUNTIME)
public @interface Deprecated
用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。
@Deprecated注解表示方法是不被建议使用的。
Deprecated是一个Marker annotation。
下面是一个使用@Deprecated注解的例子:
class A {
private String id;
A(String id){
this.id = id;
}
@Deprecated
public void execute(){
System.out.println(id);
}
public static void main(String[] args) {
A a = new A("a123");
a.execute();
}
}
4、@SuppressWarnings注解:
java.lang
注释类型 SuppressWarnings
@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(value=SOURCE)
public @interface SuppressWarnings
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。
根据风格不同,程序员应该始终在最里层的嵌套元素上使用此注释,在那里使用才有效。如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。
@SuppressWarnings注解表示抑制警告。
下面是一个使用@SuppressWarnings注解的例子:
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc");
}
5、自定义注解:
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。
自定义最简单的注解:
public @interface MyAnnotation {
}
使用自定义注解:
public class AnnotationTest2 {
@MyAnnotation
public void execute(){
System.out.println("method");
}
}
5.1、添加变量:
public @interface MyAnnotation {
String value1();
}
使用自定义注解:
public class AnnotationTest2 {
@MyAnnotation(value1="abc")
public void execute(){
System.out.println("method");
}
}
当注解中使用的属性名为value时,对其赋值时可以不指定属性的名称而直接写上属性值接口;除了value意外的变量名都需要使用name=value的方式赋值。
5.2、添加默认值:
public @interface MyAnnotation {
String value1() default "abc";
}
5.3、多变量使用枚举:
public @interface MyAnnotation {
String value1() default "abc";
MyEnum value2() default MyEnum.Sunny;
}
enum MyEnum{
Sunny,Rainy
}
使用自定义注解:
public class AnnotationTest2 {
@MyAnnotation(value1="a", value2=MyEnum.Sunny)
public void execute(){
System.out.println("method");
}
}
5.4、数组变量:
public @interface MyAnnotation {
String[] value1() default "abc";
}
使用自定义注解:
public class AnnotationTest2 {
@MyAnnotation(value1={"a","b"})
public void execute(){
System.out.println("method");
}
}
6、设置注解的作用范围:
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Retention
指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
只有元注释类型直接用于注释时,Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。
public enum RetentionPolicy
extends Enum
上一篇:java注解
下一篇:jQuery 使用 JSONP