java 注解调用_【JAVA】java注解的自定义和使用

java注解概念

Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法

java注解介绍

常用注解

@Override:表示方法是重写的方法

@Deprecated:过时的方法

@SuppressWarnings:抑制警告

注解分类

按照运行机制分

1、源码注解:注解只在源码中存在,编译成.class文件就不存在了

2、编译时注解:注解在源码和.class文件中都存在,如@Override

3、运行时注解:在运行阶段起作用,甚至会影响运行逻辑,如@Autowired

按照来源分

1、JDK自带注解

2、第三方注解

3、自定义注解

自定义注解和使用

1、使用@interface关键定义注解(Description.java),如下:

1 packagecom.hd;2

3 importjava.lang.annotation.Documented;4 importjava.lang.annotation.ElementType;5 importjava.lang.annotation.Inherited;6 importjava.lang.annotation.Retention;7 importjava.lang.annotation.RetentionPolicy;8 importjava.lang.annotation.Target;9

10 /**

11 * 注解的注解:元注解12 *13 * 注解作用域14 ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上15 ElementType.FIELD:允许作用在属性字段上16 ElementType.METHOD:允许作用在方法上17 ElementType.PARAMETER:允许作用在方法参数上18 ElementType.CONSTRUCTOR:允许作用在构造器上19 ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上20 ElementType.ANNOTATION_TYPE:允许作用在注解上21 ElementType.PACKAGE:允许作用在包上22

23 注解的生命周期24 RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件25 RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件26 RetentionPolicy.RUNTIME:永久保存,可以反射获取27 *28 */

29 //注解的作用域

30 @Target({ElementType.METHOD, ElementType.TYPE})31 //注解的生命周期

32 @Retention(RetentionPolicy.RUNTIME)33 //允许子类继承

34 @Inherited35 //生成javadoc的时候生成注解的信息

36 @Documented37 //@interface:使用@interface关键定义注解

38 public @interfaceDescription {39

40 //注解的成员41 //成员类型所限的,合法的类型包括原始数据类型及String、Class、Annotation、Enumeration

42 String desc();43

44 String author();45

46 //成员以无参无异常方式生命,可以用default为成员指定一个默认值

47 int age() default 18;48

49 //如果注解成员只有一个时,成员名必须取名未value(),在使用时可以忽略成员名和赋值号(=)50 //注解可以没有成员,没有成员的注解成为标识注解

51 }

2、在普通类上使用注解,使用方法

注解使用: @(=, =, ...)

如下:

1 packagecom.hd;2

3 /**

4 * 注解使用:5 * @(=, =, ...)6 *@authorH__D7 * @date 2019-07-09 22:49:328 *9 */

10 @Description(desc="I am class annotation", author="hd")11 public classTestDescription {12

13 @Description(desc="I am method annotation", author="hd")14 publicString test(){15

16 return "red";17 }18

19

20 }

3、解析注解,通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑

1 packagecom.hd;2

3 importjava.lang.annotation.Annotation;4 importjava.lang.reflect.Method;5

6 /**

7 * 解析注解8 * 通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑9 *10 * 对于一个类或者接口来说,Class 类中提供了以下一些方法用于反射注解。11 getAnnotation:返回指定的注解12 isAnnotationPresent:判定当前元素是否被指定注解修饰13 getAnnotations:返回所有的注解14 getDeclaredAnnotation:返回本元素的指定注解15 getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的16 *17 *@authorH__D18 * @date 2019-07-09 22:52:4219 *20 */

21 public classParseDecription {22

23 public static voidmain(String[] args) {24 //TODO Auto-generated method stub25 //1、使用类加载器加载类

26 try{27 Class c = Class.forName("com.hd.TestDescription");28 System.out.println(c);29

30 //2、找到类上面的注解

31 boolean isExist = c.isAnnotationPresent(Description.class);32

33 if(isExist) {34 //3、拿到注解实例

35 Description d = (Description) c.getAnnotation(Description.class);36 System.out.println("========parse class annotation=========");37 System.out.println("desc = " +d.desc());38 System.out.println("author = " +d.author());39 System.out.println("age = " +d.age());40 }41

42 //4、找到方法上的注解

43 Method[] ms =c.getMethods();44 for(Method m : ms) {45 boolean isMExist = m.isAnnotationPresent(Description.class);46 if(isMExist) {47 Description d = m.getAnnotation(Description.class);48 System.out.println("========parse method annotation=========");49 System.out.println("desc = " +d.desc());50 System.out.println("author = " +d.author());51 System.out.println("age = " +d.age());52 }53 }54

55 //另外一种解析方法

56 for(Method m : ms) {57 Annotation[] annotations =m.getAnnotations();58 for(Annotation annotation : annotations) {59 if(annotation instanceofDescription) {60 System.out.println("========parse method annotation other way=========");61 Description d =(Description) annotation;62 System.out.println("desc = " +d.desc());63 System.out.println("author = " +d.author());64 System.out.println("age = " +d.age());65 }66 }67 }68

69 } catch(ClassNotFoundException e) {70 //TODO Auto-generated catch block

71 e.printStackTrace();72 }73 }74 }

4、运行结果如下:

b98ae33ea0b4df9ae3dc98f53a400ff7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值