注解(Annotation)

一、注解(Annotation)

是JDK5版本后加入的技术,注解相当于是提供给JVM的注释,注解不影响程序的运行。 注解可以起到一些标注的作用,也能做一些数据的配置

二、使用注解

在使用注解时,要清楚使用注解的位置,注解的属性

1. @Override注解 : 只能修饰一个方法,标注这个方法是符合重写的语法的。

2. @Deprecated注解:标注一个方法是已过时的方法

可以修饰构造器、属性、局部变量、方法、包、参数、类和接口

3. @SuppressWarnings注解:解除警告

 使用注解时要指定属性的值

 如果注解只有一个必要的属性,属性名是value,那么在使用注解时,value=可以省略

@SuppressWarnings({"all"})
List list = new ArrayList();

如果数组只有一个元素时,{}可以省略

@SuppressWarnings("all")
/*@SuppressWarnings({"all"})
@SuppressWarnings(value={"all"})
@SuppressWarnings(value="all")*/
List list = new ArrayList();

三、自定义注解及读取注解

当要定义一些特定功能的注解,通过自定义注解+反射实现。

所有的注解都继承于Annotation,意味着可以使用Annotation接口引用任何的注解。只要定义了@Interface就是 一个注解。

1. @Target注解:修饰一个注解,标注修饰的注解的使用位置

//@Test注解可以在类或接口 、属性上使用
@Target({ElementType.TYPE,ElementType.FIELD})
public @interface Test {

}

ElementType枚举的常用的值:

TYPE:类或接口,

FIELD:属性,

METHOD:方法,

PARAMETER:参数,

CONSTRUCTOR:构造器,

LOCAL_VARIABLE:局部变量,

ANNOTATION_TYPE:注解,

PACKAGE:包

2. @Retention注解:修饰一个注解,标注这个注解的有效范围,源码、字节码、运行时。

源码范围(Source):注解在源代码中,编译后不会存留在字节码中,例如@Override注解就是源码范围。

字节码范围(Class):注解在源码、字节码中存在,在运行时不存在。

运行时范围(Runtime) : 注解在源码、字节码、运行时都存在。

@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {

}

3. 定义注解中的属性

定义属性语法格式:

类型 属性名 () [default 值] ;

其中类型一定是:基本类型、基本类型数组、String类型、String数组、Class类型、注解、枚举

@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    int i();
    String name();
    int[] nums();
    String[] names();
    Class cls();

}
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    String name() default "tom";
    String value();
}

自定义的注解本身是不具备任何功能的,仅仅是一个标注,而要实现注解的功能,其实在类中实现的注解的功能

通过反射技术,读取到注解,根据读取的注解,进行一些功能的实现

1. 修饰类的注解,使用类对象的方法读取

public static void main(String[] args) {
    //获得Student的类对象
    Class cls = Student.class;
    //获得Student类上修饰的@Test注解中的四个属性值
    Test testAnnotation = (Test)cls.getAnnotation(Test.class);
    System.out.println(testAnnotation.i());
    System.out.println(testAnnotation.value());
    System.out.println(testAnnotation.nums());
    System.out.println(testAnnotation.names());
}

2. 修饰属性的注解,使用属性对象的方法读取

public static void main(String[] args) {
    //获得Student的类对象
    Class cls = Student.class;
    //获得Student类 id属性上 修饰的@Test注解中的四个属性值
    try {
        Field field = cls.getDeclaredField("id");
        Test testAnnotation = (Test)field.getAnnotation(Test.class);
        System.out.println(testAnnotation.i());
        System.out.println(testAnnotation.value());
        System.out.println(testAnnotation.nums());
        System.out.println(testAnnotation.names());
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    }
}

3. 方法上的注解、构造器上的注解、参数前的注解 的编程步骤,同上。

四、实现BaseDao的应用

1. 底层程序员:定义注解实现BaseDao功能

通过注解完成VO类和表的映射配置,包括类名和表名、属性名和列名、列属性在类属性中的体现等映射配 置。

在BaseDao中实现映射功能。

2. 上层程序员:定义VO类,使用注解调用BaseDao功能

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aigo-2021

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值