java 反射加注解_JAVA-注解(2)-自定义注解及反射注解

dc25a6aed567a1f78fbd189afc43525a.png

JAVA-注解(2)-自定义注解及反射注解

25780a9324822a72b53b464f8496f2f8.png

自定义注解开发

1.开发一个注解类

开发一个注解类的过程,非常类似于开发一个接口,只不过需要通过@interface关键字来声明

2.使用元注解修饰注解的声明

所谓的原注解是用来修饰注解声明的注释,可以控制被修饰的注解的特性。

@Target

用来声明被修饰的注解可以用在什么位置。

可以在@Target的属性中设置Element Type类型的数组来指定可以使用的位置。

如果不使用此原注解修饰,默认注解可以用在任意位置。

@Retention

用来声明被修饰的注释会被保留到什么阶段。

可以在该注解的属性中通过RetentionPolicy类型的值来指定注释被保留到何时。

(1)RetentionPolicy.SOURCE

此注解将会被保留到源码阶段,java中,在编译过程中被删除。

这种类型的注解通常是给编译器看的。

(2)Retention Policy.CLASS

此注解将会被保留到源码阶段和编译阶段,.java和.class中,在类加载的过程中被删除。

这种类型的注解通常是给类加载器看的。

(3)RetentionPolicy.RUNTIME

此注解将会被保留在源码阶段、编译阶段和运行阶段,.java  .class和内存中的字节码中都会存在。

这种类型的注解通常在运行阶段进行反射,控制程序运行过程。

***只有RUNTIME级别的注解才可以通过反射技术进行反射。

@Documented

用来声明被修饰注解是否要被文档提取工具提取到文档中。

默认不提取

@Inherited

被修饰的注释是否具有继承性

默认没有继承性

3.为注解增加属性

注解类中还可以有声明属性。

为注解类声明属性的过程非常类似于接口定义方法。

但要求,注解中的所有的属性必须是public的,可以显式声明,也可以不声明,不声明默认就是public的。

注解中的属性只能是八种基本数据类型、String类型、Class类型、其他注解类型及以上类型的一维数组。

注解中声明的属性 需要在使用注解时,为其赋值,赋值的方式就是在使用注解时,在注解后跟上一对小括号,在括号中通过  属性名=属性值   的方式指定属性的值

也可以在声明注解时,在注解的属性后面通过default关键字,声明属性的默认值,这样一来,使用注解时不赋值,将会使用default默认值,当然也可以手动赋值,覆盖默认值。

如果属性是一维数组类型,在传入的数组中,只有一个值,则包括数组的大括号也可以省略。

如果注解的属性只有一个需要赋值,且该属性的名称叫做value,则在使用注解时,value==可以不写

反射注解

1.反射注解的原理

RetentionPolicy.RUNTIME级别的注解会保留到运行中,可以通过反射技术获取,从而可以根据是否有注解 或 注解属性值的不同来控制程序按照不同方式运行。

以下反射相关的类型中都提供了反射注解的方法:

类Class、类Method、类FIeld、类Constructor、类Package

9f57470e1390d50bf6de272d5a6d4d50.png

2.反射注解案例

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 package cn.tedu.test;

2

3 import java.lang.annotation.ElementType;

4 import java.lang.annotation.Retention;

5 import java.lang.annotation.RetentionPolicy;

6 import java.lang.annotation.Target;

7

8 @Target(ElementType.TYPE)

9 @Retention(RetentionPolicy.RUNTIME)

10 @interface level{

11 String value();

12 }

13

14 @level("刑警")

15 class Police{

16 }

17

18 public class AnnoTest02 {

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

20 System.out.println("敬了个礼,您好,您超速了,罚款200元。。。");

21 if(Police.class.isAnnotationPresent(level.class)){

22 level anno = Police.class.getAnnotation(level.class);

23 if("协警".equals(anno.value())){

24 System.out.println("哥们少罚点,50块得了~~");

25 }else if("交警".equals(anno.value())){

26 System.out.println("哥们抽根烟,这是200块,收好我走人~~");

27 }else if("刑警".equals(anno.value())){

28 System.out.println("赶紧交钱走人,别查出 别的事。。。");

29 }else{

30 System.out.println("xxx");

31 }

32 }else{

33 System.out.println("打一顿,扭送警察局。。");

34 }

35 }

36 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于Java自定义字典类、自定义注解反射注入字典值到实体类的问题。 首先,自定义字典类是一种将一些常量或者枚举类型的值封装在一起的方式。可以让代码更易读、易维护。比如,我们可以定义一个字典类,用来存储一些常量值,如: ``` public class GenderDict { public static final Integer MALE = 1; public static final Integer FEMALE = 2; } ``` 接下来,我们可以使用自定义注解来标记需要注入字典值的实体类的属性上。比如,我们可以定义一个注解类,如: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Dictionary { String value(); } ``` 在该注解类中,我们使用@Retention和@Target注解来指定注解的保留策略和作用范围。同时,我们还可以使用value属性来指定注解的值,即该属性需要注入的字典值的名称。 最后,我们可以使用反射机制,在运行时动态地将字典值注入到实体类中。具体的实现方式如下: ``` public class DictionaryInjector { public static void injectDictionary(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Dictionary.class)) { Dictionary dict = field.getAnnotation(Dictionary.class); String dictName = dict.value(); String dictValue = getDictValue(dictName); field.setAccessible(true); field.set(obj, dictValue); } } } private static String getDictValue(String dictName) { // 从字典类中获取对应的字典值 // 这里可以使用反射或者其他方式来实现 return GenderDict.MALE.equals(dictName) ? "男" : "女"; } } ``` 在上述代码中,我们首先使用Class对象获取实体类的所有属性,然后通过判断该属性是否被@Dictionary注解标记来确定是否需要注入字典值。如果需要注入,则从注解中获取字典值的名称,然后通过反射机制将字典值注入到实体类的属性中。 最后,我们可以在代码中使用如下方式来注入字典值: ``` public class User { @Dictionary("gender") private String gender; // getters and setters } public class Main { public static void main(String[] args) throws IllegalAccessException { User user = new User(); DictionaryInjector.injectDictionary(user); System.out.println(user.getGender()); // 输出 "男" } } ``` 在上述代码中,我们首先定义了一个User类,并在其中使用@Dictionary注解标记了gender属性。然后,在Main类中,我们创建了一个User对象,并调用DictionaryInjector类的injectDictionary方法来注入字典值。最后,我们通过调用User对象的getGender方法来获取注入后的字典值。 希望这能够帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值