java注解是怎么实现的

java注解是怎么实现的,第1张

注解的使用一般是与java的反射一起使用,下面是一个例子

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

自定义注解及其应用

1)、定义一个最简单的注解

public @interface MyAnnotation {

//

}

2)、把注解加在某个类上:

@MyAnnotation

public class AnnotationTest{

//

}

以下为模拟案例

自定义注解@MyAnnotation

1 package comljqtest;

2

3 import javalangannotationElementType;

4 import javalangannotationRetention;

5 import javalangannotationRetentionPolicy;

6 import javalangannotationTarget;

7

8 /

9 定义一个注解

10

11

12 @author jiqinlin

13

14 /

15 //Java中提供了四种元注解,专门负责注解其他的注解,分别如下

16

17 //@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:

18 //RetentionPolicySOURCE: 停留在java源文件,编译器被丢掉

19 //RetentionPolicyCLASS:停留在class文件中,但会被VM丢弃(默认)

20 //RetentionPolicyRUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息

21

22 //@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括

23 //ElementTypeCONSTRUCTOR: 构造器声明

24 //ElementTypeFIELD: 成员变量、对象、属性(包括enum实例)

25 //ElementTypeLOCAL_VARIABLE: 局部变量声明

26 //ElementTypeMETHOD: 方法声明

27 //ElementTypePACKAGE: 包声明

28 //ElementTypePARAMETER: 参数声明

29 //ElementTypeTYPE: 类、接口(包括注解类型)或enum声明

30

31 //@Documented将注解包含在JavaDoc中

32

33 //@Inheried允许子类继承父类中的注解

34

35

36 @Retention(RetentionPolicyRUNTIME)

37 @Target({ElementTypeMETHOD, ElementTypeTYPE})

38 public @interface MyAnnotation {

39 //为注解添加属性

40 String color();

41 String value() default "我是林计钦"; //为属性提供默认值

42 int[] array() default {1, 2, 3};

43 Gender gender() default GenderMAN; //添加一个枚举

44 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期为1988-2-18");

45 //添加枚举属性

46

47 }

注解测试类AnnotationTest

1 package comljqtest;

2

3 /

4 注解测试类

5

6

7 @author jiqinlin

8

9 /

10 //调用注解并赋值

11 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期为1988-2-18"),color="red", array={23, 26})

12 public class AnnotationTest {

13

14 public static void main(String[] args) {

15 //检查类AnnotationTest是否含有@MyAnnotation注解

16 if(AnnotationTestclassisAnnotationPresent(MyAnnotationclass)){

17 //若存在就获取注解

18 MyAnnotation annotation=(MyAnnotation)AnnotationTestclassgetAnnotation(MyAnnotationclass);

19 Systemoutprintln(annotation);

20 //获取注解属性

21 Systemoutprintln(annotationcolor());

22 Systemoutprintln(annotationvalue());

23 //数组

24 int[] arrs=annotationarray();

25 for(int arr:arrs){

26 Systemoutprintln(arr);

27 }

28 //枚举

29 Gender gender=annotationgender();

30 Systemoutprintln("性别为:"+gender);

31 //获取注解属性

32 MetaAnnotation meta=annotationmetaAnnotation();

33 Systemoutprintln(metabirthday());

34 }

35 }

36 }

枚举类Gender,模拟注解中添加枚举属性

1 package comljqtest;

2 /

3 枚举,模拟注解中添加枚举属性

4

5 @author jiqinlin

6

7 /

8 public enum Gender {

9 MAN{

10 public String getName(){return "男";}

11 },

12 WOMEN{

13 public String getName(){return "女";}

14 }; //记得有“;”

15 public abstract String getName();

16 }

注解类MetaAnnotation,模拟注解中添加注解属性

1 package comljqtest;

2

3 /

4 定义一个注解,模拟注解中添加注解属性

5

6 @author jiqinlin

7

8 /

9 public @interface MetaAnnotation {

10 String birthday();

11 }

spring 注解可以减少xml配置;

注释配置相对于 XML 配置具有很多的优势:

它可以充分利用 Java

的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO

的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java

反射机制获取。

注释和 Java 代码位于一个文件中,而 XML

配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的

XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

AnnotationBeanNameGenerator 是spring的默认生成策略,我们看一眼源码,其中 buildDefaultBeanName 方法是生成名称的实现,具体如下:

显而易见的,此处通过Bean类名的生成策略。

这里 definitiongetBeanClassName() 是获取全限定名称的, ClassUtilsgetShortName 是获取类名的,下面的 Introspectordecapitalize 实际上就是把首字母变小写的。

自定义实现类叫 MyAnnotationBeanNameGenerator ,然后继承 AnnotationBeanNameGenerator或者实现BeanNameGenerator接口 ,之后重写 buildDefaultBeanName 方法,返回 definitiongetBeanClassName() ,这样我们这个生成策略就写好了。

打开 applicationContextxml 文件,找到我们配置 context:component-scan 这块,增加一个参数 name-generator=MyAnnotationBeanNameGenerator

values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取

我知道

1先获取这个类的class

Class<> objclass=tgetClass();

2 获取这个类的字段属性

Field[] at = objclassgetDeclaredFields();

3遍历所有字段

for (Field fd : at) {

//比如获取这个字段上是否包含NotNull

if (fdisAnnotationPresent(NotNullclass)) {

//这样就获取到这个注解属性了

NotNull d = fdgetAnnotation(NotNullclass);

}

}

4要获取一个注解,你要先获取他所在的字段

希望对你有帮助!

以上就是关于java注解是怎么实现的全部的内容,包括:java注解是怎么实现的、java spring4现在推荐使用annotation而不是配置文件有什么优点、Spring中Bean名的自定义生成策略等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9333203.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存