-
@interface自定义注解
- @interface自定义注解自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
- 在定义注解时,不能继承其他的注解或接口。
- 使用@interface来声明一个注解
-
@interface使用规则
- 每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称
- 使用@interface来声明一个注解
- 返回值类型就是参数的类型,(返回值类型只能是基本类型、Class、String、enum)
- 可以通过default来声明参数的默认值
-
@interface 系统自定义注解
- @Override 重载某个方法
- @Deprecated 用来表示某个类的属性或方法已经过时
- @SuppressWarnings 来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候
eg:一个自定义注解MyFiled
/*
方法名称value ,类型 String ,默认值 "testMyFiled"
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyFiled{
String value() default "testMyFiled";
}
xxx.java
@MyFiled(value = "test")
public void testMyField(){
int a = 0;
};
//使用该Method
//获取当前class的所有方法
Method[] methods = this.getClass().getMethods();
List<Method> list = new ArrayList<Method>();
for (int i = 0;i < methods.length;i++)
list.add(methods[i]);
for (Method m:list){
//获取关于MyFiled注解的方法
MyFiled myFiled = m.getAnnotation(MyFiled.class);
if(myFiled != null){
//此时val=test
String val = myFiled.value();
try {
//调用testMyField方法
m.invoke(this);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
-
@Retention
- RetentionPolicy.CLASS:表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候
- RetentionPolicy.SOURCE:表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
- RetentionPolicy.RUNTIME:表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时。可以运用反射的方式从JVM中读取Annotation注解的信息。例如上述demo
-
@Target
- ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
- ElementType.FIELD:用于描述域
- ElementType.METHOD:用于描述方法
- ElementType.PARAMETER:用于描述参数
- ElementType.CONSTRUCTOR:用于描述构造器
- ElementType.LOCAL_VARIABLE:用于描述局部变量
- ElementType.ANNOTATION_TYPE:用于描述注解类型
- ElementType.PACKAGE:用于描述包
- ElementType.TYPE_PARAMETER:用来标注参数类型
- ElementType.TYPE_USE:标注任何类型名称
关于反射的方法,将在后文分解。
参考文章:
@interface 用法
https://www.cnblogs.com/liaojie970/p/7879917.html
https://blog.csdn.net/zhangbeizhen18/article/details/87885441
反射之Method基本用法
https://www.cnblogs.com/lyly/p/3344290.html