您当前的位置: 首页 > 

基于反射 自定义注解

梁云亮 发布时间:2020-03-20 14:08:01 ,浏览量:3

自定义注解的规则
  • Annotation型 (注解类) 使用@interface定义, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口。
  • 参数成员只能用public或默认(default)这两个访问权限修饰
  • 参数成员只能用基本类型byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、annotations等数据类型以及这一些类型的数组。
  • 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取
元注解 @Target

@Target注解表示注解标注的范围,在注解类型的声明中使用@target可更加明晰其修饰的目标。 @Target注解源码里面有一个value()方法,该方法的返回值是一个枚举类型的数组,这个枚举定义了注解类型可应用于Java程序的哪些元素之上,它的源代码如下:

public enum ElementType {
    TYPE,				//适用于类、接口、枚举
    FIELD,				//适用于成员变量
    METHOD,				//适用于方法
    PARAMETER,			//适用于方法的参数
    CONSTRUCTOR,			//适用于构造方法
    LOCAL_VARIABLE,		//适用于局部变量
    ANNOTATION_TYPE,		//适用于注解类型
	PACKAGE,				//适用于包
	TYPE_PARAMETER,  //java 8特性,用于描述参数类型
	TYPE_USE  //java 8特性,用于描述使用在类型的地方。如类型转换,泛型之类的
}

在使用@Target时,至少要提供这些枚举值中的一个、以指定自定义的注解类型可以应用于程序的哪些元素之上。

@Retention

@Retention用来设置注解是否保存在class文件中的,它可以用来指定Java编译器处理类中出现的注解的时机,它的取值在RetentionPolicy中定义:

public enum RetentionPolicy {
	SOURCE,		//编译器处理完后,不保留注解到编译后的类文件中
	CLASS,		//将注解保留在编译后的类文件中,但是在运行时忽略它
	RUNTIME		//将注解保留在编译后的类文件中,并在第一次加载类时读取它
}
@Documented 注解

指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。

自定义注解:模仿实现JPA中的@Table注解

第一步:自定义注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}

第二步:自定义实体类

@Table("tb_stu")
public class Stu {
}

第三步:测试代码:

public class DemoTest {
    public static void main(String[] args) {
        Class Clazz = Stu.class;
        Table table = Clazz.getAnnotation(Table.class);
        String tableName = table.value();
        System.out.println(tableName);
    }
}

运行测试代码,会在控制台中输出字符串tb_stu。

关注
打赏
1688896170
查看更多评论

梁云亮

暂无认证

  • 3浏览

    0关注

    1121博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.2253s