spring中的java基础(注解)

注解

一、什么是注解

它提供了一种安全的类似注释的机制,用来将任何 的信息或元数据与程序元素进行关联。为程序的元素加上更直关、更明了的说明,这些说明信息与业务逻辑无关,并且供制定的工具或框架使用。

类似@Overrude这种其实就是注解中一种。

二、内置注解

1、@Deprecated

编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素,比如过时的方法:过时的类、过时的成员变量。

2、@Override

提时子类要复写父类中被@Override修饰的方法。

3、@SuppressWarnings

阻止警告的意思。调用被@Deprecated注解的方法后,编译器会警告提示,而有时候开发者会忽略这种警告,他们看样子调用的地方通过@SuppressWarnings:达到目的。

4、@SafeVarargs

参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生unchecked这样的警告。它是在Java1.7的版本中加入的。

5、@FunctionalInterface

函数式接口注解,这个是Java1.8版本引入的新特性,函数式变成很火,所以Java8也及时添加了这个特性。函数式接口(Functional Interface)就是一个具有一个方法的普通接口。

三、元注解

在创建自定义注解时,元注解负责注解自定义注解。

1、@Retention

定义注解的生命周期

1)RetentionPolicy.SOURCE

在编译阶段丢弃。这些注解在编译结束之后不再有任何意义。所以它们不会写入字节码。@Override属于这类注解。

2)RetentionPolicy.CLASS

在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方法。

3)RetentionPolicy.RUNTIME

始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方法。

2、@Target

表示注解用于什么地方

1)ElementType.CONSTRUCTOR

用于描述构造器。

2)ElementType.FIELD

成员变量、对象、属性(包括enum实例)

3)ElementType.LOCAL_VARIABLE

用于描述局部变量

4)ElementType.METHOD

用于描述方法。

5)ElementType.PACKAGE

用于描述包。

6)ElementType.PARAMETER

用于描述参数。

7)ElementType.TYPE

用于描述类、接口(包括注解类型)或enum声明。

3、@Documented

表示是否将注解信息添加在Java文档中

4、@Inherited

定义注解和子类的关系
@Inherited(class)将定义这个类被继承的。表示这个annotation类被用于该类的子类。

5、@Repeatable

指定注解可重复使用

四、自定义注解

自定义注解就是元注解负责注解的,但自定义注解时是有一些规则限制的。
Anootation类被定义为@interface,并不能再继承别的类或接口。

参数成员只能用public或默认两个访问权修饰。

参数成员只能用八种基本数据类型,byte、short、char、int、long、float、double、boolean。和String、Enum、Class、annotations等数据类型,以及这些类型的数组。

要获取类方法的字段和注解信息,必须通过java的反射技术来获取Annotations对象。

注解可不定义成员。

使用自定义注解的例子

CustomDescription注解,相当于标签。为了能贴多标签,定义注解容器CustomDescriptions。

CustomDescription

import java.lang.annotation.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Retention(RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Repeatable(CustomDescriptions.class)
public @interface CustomDescription {
    String description() default "";
}

CustomDescriptions

import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.TYPE;
@Documented
@Retention(RUNTIME)
@Target(TYPE)
@Inherited
public @interface CustomDescriptions {
    CustomDescription [] value();
}

演示注解,创建一个基类Person,来添加两个自定义注解。再进行反射输出

Person

@CustomDescription(description = "基类")
@CustomDescription(description = "人")
public class Person {
    private String Name;
    public String getName(){
        return Name;
    }
    public void setName(String name){
        Name = name;
    }
}
public class CusAnnontation {
    //TODO
    public static void main(String [] value) {
        CustomDescriptions customDescriptions = new Person().getClass().
getAnnotation(CustomDescriptions.class);
        for (CustomDescription h : customDescriptions.value()) {
            System.out.println("description:" + h.description());
        }
    }
}
执行结果

为了探究他的继承性,我们再创建一个student学生类继承person类并在student中加一个自定义注解

Student

@CustomDescription(description = "学生")
public class Student extends Person {
    private  String StudentId;
    public String getStudentId(){
        return StudentId;
    }
    public void setStudentId(String studentId){
        StudentId = studentId;
    }
}

程序入口改,将从person类改成student类

public class CusAnnontation {
    //TODO
    public static void main(String [] value) {
        CustomDescriptions customDescriptions = new Student().getClass().getAnnotation(CustomDescriptions.class);
        for (CustomDescription h : customDescriptions.value()) {
            System.out.println("description:" + h.description());
        }
    }
}

执行结果


执行结果

发现程序并没有使用子类的注解,@CustomDescription(description = "学生"),而是沿用了基类注解。当我们更改程序,使student的注解完全覆盖person类的注解时,即在student中添加多两个注解

@CustomDescription(description = "优秀")
@CustomDescription(description = "学生")
@CustomDescription(description = "人")
public class Student extends Person {
    private  String StudentId;
    public String getStudentId(){
        return StudentId;
    }
    public void setStudentId(String studentId){
        StudentId = studentId;
    }
}

执行结果


执行结果

发现这时注解是使用了子类的,并没有继承到父类的注解。

提出问题

为何在使用可继承可重用的自定义注解时,当子类可重用注解个数大于父类时,就不输出继承的结果呢?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容