版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。喜欢请关注哟~ https://blog.csdn.net/sjt223857130/article/details/83215563
如何创建一个注解:@TransientFlex
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//用于序列化的注解,使用此标记不会被序列化
@Retention(RetentionPolicy.RUNTIME)
public @interface TransientFlex {
}
@Documented: 用于标记在生成javadoc时是否将注解包含进去。
@Target:用于定义注解可以在什么地方使用,默认可以在任何地方使用。
- TYPE : 类、接口或enum声明
- FIELD: 域(属性)声明
- METHOD: 方法声明
- PARAMETER: 参数声明
- CONSTRUCTOR: 构造方法声明
- LOCAL_VARIABLE:局部变量声明
- ANNOTATION_TYPE:注释类型声明
- PACKAGE: 包声明
@Inherited:允许子类继承父类中的注解,可以通过反射获取到父类的注解。
@Constraint:用于校验属性值是否合法
@Retention:注解的声明周期,用于定义注解的存活阶段,可以存活在源码级别、编译级别(字节码级别)、运行时级别
- SOURCE:源码级别,注解只存在源码中,一般用于和编译器交互,用于检测代码。如@Override, @SuppressWarings。
- CLASS:字节码级别,注解存在于源码和字节码文件中,主要用于编译时生成额外的文件,如XML,Java文件等,但运行时无法获得。 如mybatis生成实体和映射文件,这个级别需要添加JVM加载时候的代理(javaagent),使用代理来动态修改字节码文件。
- RUNTIME:运行时级别,注解存在于源码、字节码、java虚拟机中,主要用于运行时,可以使用反射获取相关的信息。
使用定义的注解:
public class Info {
public int uid;
@TransientFlex
public String nickname;
@TransientFlex
public void setParser(Object data) {
}
@TransientFlex
public Object getParser() {
Object data = new Object();
return data;
}
}
获取属性或方法上的注解,判断是否包含某个注解:
// 判断类的方法上是否存在某个注解
Method[] methods = 类.class.getMethods();
for (Method method : methods) {
Annotation anno = method.getAnnotation(TransientFlex.class);
if (anno != null) {
System.out.println(method.getName() + "==>" + anno.toString());
}
}
// 判断类的属性上是否存在注解
Field[] fields = 类.class.getFields();
for (Field field : fields) {
Annotation anno = field.getAnnotation(TransientFlex.class);
if (anno != null) {
System.out.println(field.getName() + "==>" + anno.toString());
}
}