Java23--注解

1 注解

1.1 概念

注解很厉害,它可以增强我们的java代码,同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。传统我们通过xml文本文件声明方式,而现在最主流的开发都是基于注解方式,代码量少,框架可以根据注解去自动生成很多代码,从而减少代码量,程序更易读。例如最火爆的SpringBoot就完全基于注解技术实现。

注解设计非常精巧,初学时觉得很另类甚至多余,甚至垃圾。有了java代码干嘛还要有@注解呢?但熟练之后你会赞叹,它竟然可以超越java代码的功能,让java代码瞬间变得强大。大家慢慢体会吧。

常见的元注解:@Target、@Retention,jdk提供将来描述我们自定义的注解的注解。听起来好绕,别着急,做两个例子,立刻清晰。现在现有“元注解”这个概念。

1.2 分类

JDK自带注解

元注解

自定义注解

1.3 JDK注解

JDK注解的注解,就5个:

@Override

@Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期

@SuppressWarnings(“deprecation”) 忽略警告

@SafeVarargs jdk1.7出现,堆污染,不常用

@FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用

1.4 元注解

描述注解的注解,就5个:

@Target 注解用在哪里:类上、方法上、属性上

@Retention 注解的生命周期:源文件中、class文件中、运行中

@Inherited 允许子注解继承

@Documented 生成javadoc时会包含注解,不常用

@Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用

1.5 @Target ElementType.class

描述注解的使用范围:

ElementType.ANNOTATION_TYPE 应用于注释类型

ElementType.CONSTRUCTOR 应用于构造函数

ElementType.FIELD 应用于字段或属性

ElementType.LOCAL_VARIABLE 应用于局部变量

ElementType.METHOD 应用于方法级

ElementType.PACKAGE 应用于包声明

ElementType.PARAMETER 应用于方法的参数

ElementType.TYPE 应用于类的元素

1.6 @Retention RetentionPolicy.class

定义了该注解被保留的时间长短,某些注解仅出现在源代码中,而被编译器丢弃;

而另一些却被编译在class文件中; 编译在class文件中的注解可能会被虚拟机忽略,而另一些在class被装载时将被读取。

为何要分有没有呢?没有时,反射就拿不到,从而就无法去识别处理。
SOURCE 在源文件中有效(即源文件保留)

CLASS 在class文件中有效(即class保留)

RUNTIME 在运行时有效(即运行时保留)

1.7 自定义注解

1.7.1 定义注解

//1,定义注解

//1.1,设置注解的使用范围@Target,啥都不写,哪儿都能用

//@Target({ElementType.METHOD})//作用于方法上

//@Target({ElementType.FIELD})//作用于属性上

@Target({ElementType.METHOD , ElementType.PACKAGE})//作用范围

@Retention(RetentionPolicy.SOURCE)//生命周期

@Target({ElementType.TYPE})//作用于类上

@interface Test{

    //3,定义属性

    int age() default 0;//使用时,必须给age属性赋值,如:age=X。除非设置好默认值。

//()不是参数,也不能写参数,只是特殊语法

   

    //4,特殊属性value

    String value() default "";//使用时,必须给value属性赋值,如:X  |  value=X。除非设置好默认值

}

注意:注解的语法写法和常规java的语法写法不同

1.7.2 使用注解

//2,使用注解

//@Test

//5,注解的组合属性

@Test(value="",age=0)

class HelloTest{

//  @Test(value="",age=0)

    String name;

}

1.7.3 解析注解

判断注解是否存在

package javapro.spring.annotation;

 

public class TestAnnotation {

    public static void main(String[] args) throws ClassNotFoundException {

       Class<?> clazz = Class.forName("javapro.spring.annotation.HelloController");

       Controller c = clazz.getAnnotation(Controller.class);

      

       if( c != null) {

           System.out.println(c);

           System.out.println(c.value());

       }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值