Java面试题-Java核心基础-第十一天(注解)

目录

一、注解是什么?

二、注解的作用?

三、Java中的内置注解有哪些?

四、如何自定义一个注解?

五、JDK8中的新特性


一、注解是什么?

注解就是一种可以标注在类、属性、方法、方法参数等结构上面的一种特殊“注释”,其实就可以看作是一种注释,这些注释信息可以生成文档、可以进行编译检查、可以在运行时获取到注释信息

二、注解的作用?

1. 生成文档 类上面的作者、时间、简要信息等信息  方法上面的对方法进行上面  对方法参数、返回值进行说明

2. 编译检查,例如@Overide  可以检查方法是否是重写的方法 

@Deprecated是标识方法已过时  @SuppressWarnings标明要忽略的警告 在编译是能够进行检查

3. 编译时动态处理:可以在编译时对代码的元数据信息进行动态处理,比如动态生成代码

4. 运行时动态处理:可以在运行时对代码的元数据信息进行动态处理,比如利用反射创建实例

一般需要结合反射使用才能发挥作用

三、Java中的内置注解有哪些?

1. Java自带的标准注解:

@Overide、@Deprecated是标识方法已过时、@SuppressWarnings标明要忽略的警告 编译的时候会对其进行检查

2. 元注解

@Target:标明注解能放置到那些位置上

@Target({ElementType.TYPE,ElementType.FIELD}) 可以声明的类型:

TYPE(类型,指的是类、接口、枚举)、FIELD(属性)、METHOD(方法)、PAR AMETER(参数)、CONSTRUCTOR(构造器)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE(注解类型)、PACKAGE(包)、TYPE_PARAMETER(类型 参数)、TYPE_USE(类型参数,更加广泛)

@Retention:标明注解的生命域 

属性值是RententionPolicy类型的枚举值:SOURCE(表示只存在于源文件中,编译后的字节码中不存 在,并且不能通过反射获取到)、CLASS(表示在字节码中也存在了,但还是不能通过反射获取到),RUNTIME(表示可以通过反射获取到)

@Retention(RetentionPolicy.RUNTIME)

@Inherited元注解:加上其注解,表示其被修饰的注解可以被子类所继承

@Document元注解:表示在生成的文档中,能包含注解信息

四、如何自定义一个注解?

1. 使用@Interface创建注解

2. 写好注解的元注解

3. 写好注解里面的属性:

注意如果只是一个value可以忽略,如果有多个参数的情况下,只有其他参数都有默认值的情况下,value才能进行忽略

类型也不是任意的类型都行的,类型只能时  八种基本数据类型及其对应的包装类型、String、Class、Enum 、注解类型及这些类型对应的数组类型

五、JDK8中的新特性

1. 可重复注解

就是可以在结构上面重复的写一个相同的注解,在jdk8之前需要使用注解数组的方式

1. 定义你要重复的那个注解:

@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
    Status status() default Status.OK;
}

2. 构造一个注解表明你要重复  属性类型就是注解数组

@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
//因需要重复的注解而构造的s注解属性值必须是value
public @interface MyAnnotations {
    MyAnnotation [] value();
}

 3. 在之前你要重复的那个注解上面加上@Repeatable(value = MyAnnotations.class)元注解

@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(value = MyAnnotations.class)
public @interface MyAnnotation {
    String value();
    Status status() default Status.OK;
}

使用:

@MyAnnotation("abc")
@MyAnnotation("def")
public class MidStudent extends Student{
}

2. 类型注解

顾名思义就是在类型前面加上注解,用来 解释 类型

像这样:

public class School <@MyAnnotation1(value = "fa") T >{
    public void dosome(T t){
        //这种类型注解如果能使用,得在注解的Target元注解加上ElementType.TYPE_USE
        @MyAnnotation1("da") String name = "";
    }
}

使用的条件是在@Target注解中写好ElementType.TYPE_USE类型

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
@Inherited
@Documented
public @interface MyAnnotation1 {
    String value();
}

你可能感兴趣的:(Java核心基础,Java面试题,1024程序员节,java面试,java核心基础)