注解与使用

目录

一、内置注解

二、自定义注解


注释:注释是存在于源文件的给其他程序员看的,如果你换个文件(从.java换到.class)打开,注释就不存在了。

注解:注解不仅是给人看的,也是给编译器看的。例如,告诉编译器不需要检查此段代码的的格式等等。

注解是一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

主要作用:

1、编译格式检查
2、反射中解析
3、生成帮助文档
4、跟踪代码依赖


一、内置注解

就是系统已经存在的注解,我们可以直接拿来用。

1、@Override : 重写 
定义在java.lang.Override。

是用来检查重写格式是否正确的注解。

eg:

 如果我们将toString改成toString1则报错,因为toString有父类,但toString1没有!所以报错。

2、 @Deprecated:废弃 
定义在java.lang.Deprecated

表示这个方法已经不建议用了,比如,一开始写了一个方法,你一直在用,一直都没有bug,但是有一天,你用在新的情境下,突然就出了bug。这时候,你不能删除,也不能改。(因为前面一直在用,改了可能出新bug)所以,这时候,你把它标记为废弃。这样,别人要用这个方法的时候,编译器就会提醒他,这个方法已经被废弃。不建议使用。但是硬要用,还是可以用的,因为方法本身并没有删除。

eg:写一个Person类:废弃setAge,新写一个setAge2.

class Person {
    int age;
    public int getAge() {
        return age;
    }
    /**
     * 此方法被废弃,请用setAge2
     * @param age
     */
    @Deprecated
    public void setAge(int age) {
        this.age = age;
    }
    public void setAge2(int age) {
        if(age<0||age>150){
            throw new RuntimeException("年龄不合理");
        }
        this.age = age;
    }
}

这样,在main中想用setAge时,就会:不建议用!

 3、@FunctionalInterface: 函数式接口 *
Java 8 开始支持,标识一个匿名函数或函数式接口。

用来提醒这是一个函数式的接口

 4、SuppressWarnings:抑制编译时的警告信息。 *
定义在java.lang.SuppressWarnings
三种使用方式
1. @SuppressWarnings("unchecked") [^ 抑制单类型的警告]
2. @SuppressWarnings("unchecked","rawtypes") [^ 抑制多类型的警告]
3. @SuppressWarnings("all") [^ 抑制所有类型的警告]

eg:我们在创建一个对象/方法等一些东西时,如果后面没有用到则会收到警告,告诉我们,从来没用过,删了吧。

 这时候,如果我们想忽略警告,就需要加上注解SuppressWarnings  

 这时,就不会再有警告了。

这就是我们常用的能用得到的注解。

二、自定义注解

一、元注解

元注解是作用在其他注解的注解。

1、@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可
以通过反射访问。
2、@Documented - 标记这些注解是否包含在用户文档中 javadoc。
3、@Target - 标记这个注解应该是哪种 Java 成员。
4、@Inherited - 标记这个注解是自动继承的:

        4.1. 子类会继承父类使用的注解中被@Inherited修饰的注解
        4.2. 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
        4.3. 类实现接口时不会继承任何接口中定义的注解

 注解定义格式:

@interface 自定义注解名{}

注意事项:

1. 定义的注解,自动继承了java.lang,annotation.Annotation接口
2. 注解中的每一个方法,实际是声明的注解配置参数
                         ·方法的名称就是 配置参数的名称
                         ·方法的返回值类型,就是配置参数的类型。只能是:基本类型/Class/String/enum
3. 可以通过default来声明参数的默认值
4. 如果只有一个参数成员,一般参数名为value
5. 注解元素必须要有值,我们定义注解元素时,经常使用空字符串、0作为默认值。

@Target({ElementType.TYPE,ElementType.METHOD})
//第一个参数表示,这个注解可以加在类上,第二个参数表示,这个注解可以加在方法上
@Documented  //允许继承在文档里
@Retention(RetentionPolicy.RUNTIME)  //保存策略为RUNTIME,如下面的图!
@Inherited  //可以继承
    
@interface MyAnnotation{  //注解内容
    String value();
    int num();
    //注解配置参数
}

我们用注解时,要传入参数:(给这个类用注解)

@MyAnnotation(value = "haha",num = 13) //如果不写value=,num=那么默认为value的值
public class Demo2 {
    public static void main(String[] args) {

    }
}

如果不想必须传参数,我们也可以给参数设默认值:调用时,传入参数则用新参数代替默认参数。如果不传参数,则使用默认参数。

@interface MyAnnotation{  //注解内容
    String value() default "heiehi";  //用default加默认值
    int num() default 0; 
    //注解配置参数
}

 RetentionPolicy保存策略:RUNTIME为最大范围,包含CLASS包含SOURCE。CLASS包含SOURCE。一般我们都用最大范围,即RUNTIME

 这就是注解,可能很多地方都看不明白。建议看下篇《反射》,看完再回来二次理解。搭配使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值