1,注解一般和反射联合使用
2,jdk自带注解有三个:@Override、@Deprecated、@SuppressWarnings
3,定义注解需要使用元注解。
4,元注解:只能用来定义注解,有四个:
@Target代表作用域(在哪里调用)
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
@Retention代表存在的生命期(源码,编译期,运行时)
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.被JVM抛弃
*/
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.
* 运行时存在可以被反射读取
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
@Documented(是否包含在javadoc)、
@Inherited(是否允许子类继承父类的注解)
5,注解的属性类型有限制,只能是 String,Class,Annotation,Enumeration其中的类型。
举例:
@Target(ElementTYpe.METHOD,ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface GET{
String desc();
String url();
}
让调用生效:
使用反射读取对应类的作用域,比如我们例子里的函数,反射读取出调用传入的值,编写逻辑即可。
定义好之后,就可以根据作用域来调用了。
@GET(desc=“i’m desc’,url=“https://www.api.com”)
public String apiQueryListData(){…}