注解与反射 - 注解

本文深入解析注解在JDK5.0后的应用,包括元注解如@Target、@Retention、@Documented和@Inherited的作用,内置注解如@Override、@Deprecated和@SuppressWarnings的用法,以及如何自定义注解并理解其配置。了解注解在类、方法和字段上的应用,以及通过反射获取元数据。
摘要由CSDN通过智能技术生成

什么是注解

  • 注解有检查与约束的规范

  • Annotation是从JDK5.0开始引入的新技术。

    1. 不是程序本身,可以对程序作出解释(这一-点和注释(comment)没什么区别)。
    2. 可以被其他程序(比如:编译器等)读取。
  • ◆Annotation的格式:

    1. 如:@SuppressWarnings(value=“unchecked”).
  • Annotation在哪里使用?

    1. 可以附加在package , class , method, field等上面,相当于给他们添加了额外的辅助信息。

    2. 我们可以通过反射机制编程实现对这些元数据的访问

注解分为元注解和内置注解

元注解

  • 元注解的作用就是负责注解其他注解, Java定义了4个标准的meta -annotation类型,他们被用来提供对其他annotation类型作说明.

  • 这些类型和它们所支持的类在java.lang.annotation包中可以找到 ( @Target , @Retention,@Documented , @Inherited )

(SOURCE < CLASS < RUNTIME)

  1. @Target :用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
  2. @Retention :表示需要在什么级别保存该注释信息,用于描述注解的生命周期
  3. @Document: 说明该注解将被包含在javadoc中
  4. @Inherited: 说明子类可以继承父类中的该注解

内置注解

  • @Override :定义在java.lang.Override中, 此注释只适用于修辞方法,表示-个方法声明打算
    重写超类中的另一个方法声明.

  • @Deprecated :定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示不
    鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择.

  • @SuppressWarnings :定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息.

    与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,
    我们选择性的使用就好了.

    1. @SuppressWarnings(“ll”)
    2. @SuppressWarnings(“unchecked”)
    3. @SuppressWarnings(value={“unchecked” “deprecation”})

自定义注解

  • 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口

    1. @ interface用来声明一个注解,格式: public @ interface注解名{定义内容}
    2. 其中的每-一个方法实际 上是声明了一个配置参数.
    3. 方法的名称就是参数的名称.
    4. 返回值类型就是参数的类型(返回值只能是基本类型 ,Class , String , enum ).
    5. 可以通过default来声明参数的默认值
    6. 如果只有一个参数成员,一般参数名为value
    7. 注解元素必须要有值,我们定义注解元素时, 经常使用空字符串,0作为默认值

简单的自定义注解

//定义一个注解
//Target 用来标识该注解用来放在什么位置 分别为 类上 方法上 。。。
@Target({ElementType.TYPE,ElementType.METHOD})
//Retention 标识我们的注解在什么时候有效
@Retention(RetentionPolicy.RUNTIME)
//表示我们的注解生成在javaDoc中
@Documented
//表示子类可以继承父类的注解
@Inherited
@interface myAnnotation{}

比较复杂的自定义注解

@myAnnotation()
public class Demo01 {}
//定义一个注解
//Target 用来标识该注解用来放在什么位置 分别为 类上 方法上 。。。
@Target({ElementType.TYPE,ElementType.METHOD})
//Retention 标识我们的注解在什么时候有效
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation{
   String name() default "";
   int age() default 1;
   //代表不存在  和indexOf 差不多 找不到就返回-1
   int id() default -1;
   String[] gri() default {"a","b"};
}

如果注解的变量不带默认值的话在使用的时候要显示的调用

@myAnnotation(name = "Mayb")
public class Demo01 {}

//定义一个注解
//Target 用来标识该注解用来放在什么位置 分别为 类上 方法上 。。。
@Target({ElementType.TYPE,ElementType.METHOD})
//Retention 标识我们的注解在什么时候有效
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation{
    String name() ;
    int age() default 1;
    //代表不存在  和indexOf 差不多 找不到就返回-1
    int id() default -1;
    String[] gri() default {"a","b"};
}

如果只有一个变量的话可以使用value 可以在使用时直接写参数

@myAnnotation1("Mayb")
public class Demo01 {

}
@interface myAnnotation1{
    String value();
}

其他注解

这里 的注解可能在未来使用中会陆续编辑修改

1、@Controller

@Controller用于标记在一个类上,使用它标记的类就是一个SpringMvc Controller对象,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了**@RequestMapping注解。
@Controller只是定义了一个控制器类,而使用
@RequestMapping**注解的方法才是处理请求的处理器。

2、@Configuration

@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被 @Bean 注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
注意:@Configuration注解的配置类有如下要求:
1、@Configuration不可以是final类型;
2、@Configuration不可以是匿名类;
3、嵌套的@Configuration必须是静态类。

3、@Component

1、@Controller 控制器(注入服务)

用于标注控制层,相当于struts中的action层
2、@Service 服务(注入dao)

用于标注服务层,主要用来进行业务的逻辑处理
3、@Repository(实现dao访问)

用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
4、@Component (把普通pojo实例化到spring容器中,相当于配置文件中的

泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于 @Controller@Services等的时候),我们就可以使用 @Component 来标注这个类。
案例:

<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
共同点:被 @Controller@Service@Repository@Component注解的类,都会把这些类纳入进spring容器中进行管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值