Java注解

注解能方便开发者快速完成功能需求。现在大部分主流都使用注解进行开发,如Spring Boot、SSM等。

注解分为三类:预定义注解,即由JVM进行解释的注解、自定义注解,开发者根据需要自己实现的注解、元注解,定义在注解上的注解,帮助开发者完成自定义注解。

1.预定义注解:

1.1 @Override

:使用该注解的方法为重写方法,为实现类实现或重写接口规定方法的标识,重写方法必须与父类方法的方法名一致、参数一致、返回值一致、访问权限大于等于父类方法、抛出异常小于等于父类方法。

        访问权限:public 、protected  、默认  、private

定义接口:

public interface InterDemo throws Exception{
    //方法
    public String show(String name);
}

 实现方法:

public class InterDemoImpl implements InterDemo{
    //重写注解
    @Override
    public String show(String name) throws IOException {
        Date date = new Date();
        return name;
    }
}

1.2 @Deprecated

:该注解标识一个方法已经过时了,在调用加有该注解的方法时会在方法名上加一个中划线。

比如:

 1.3 @FuncationInterface

:函数式接口,使用该注解的接口有且仅有一个抽象方法,JDK8开始加入

@FunctionalInterface
public interface InterDemo {
    public String show(String name) throws Exception;
}

如果再给接口加一个方法则会报错。

2.自定义注解

语法:public @interface 注解名{ }

public @interface MyAnnotation {

}
//类上加注解
@MyAnnotation
public class Test {
    public static void main(String[]args){
        Test test = new Test();
        test.fan("小周");
    }
    
    //属性加注解
    @MyAnnotation
    private String name;
    
    //方法加注解
    @MyAnnotation
    public void fan(@MyAnnotation String name){  //参数加注解
        System.out.println(name + "你好~");
    }
}

仅仅定义了自定义注解没有使用作用,需要结合反射来解析自定义注解赋予相应的作用。

@Override:JVM解析该注解

@Controller:Spring框架解析该注解

3.元注解

以上自定义注解可以用在类上、方法上、属性上、参数上,但实际应用上要根据实际需求限制注解的适用范围和时效。

@Retention:限制注解什么时候生效。(源码-字节码-运行)默认在字节码有效

@Target:限制注解用在哪些地方  默认可以在任意位置使用

@Documented:设定生成的api文档是否含有该注解

/**
 * 自定义注解
 * 元注解 注解在注解上的注解
 * @Target 定义生效范围 TYPE类 METHOD方法 FIELD属性 PARAMETER参数  默认全部生效
 * @Retention 定义生效时间 SOURCE源码 CLASS字节码 RUNTIME运行时  默认字节码生效
 * @Documented 在生成api文档时类是否带有注解
 */

@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@Retention(value = RetentionPolicy.SOURCE)
@Documented
public @interface MyAnnotation {

}

4.自定义注解(属性)

语法:

public @interface 注解名 {

        数据类型 属性名() default 默认值;

        //如果没有设置默认值,那么在使用该注解时必须为该属性指定值。

}

@Target(value = {ElementType.TYPE})
@Retention(value = RetentionPolicy.SOURCE)
@Documented
public @interface MyAnnotation {
    String value() default "";
    int age() default 18;
    String[] hobby() default {};
}

 如果只为 value 赋值,value 可以省略不写:

@MyAnnotation(value = "周")   => @MyAnnotation("周")

如果为数组赋值,数组只有一个值那么{ }可以省略,如果有多个数值那么必须写{ }

@MyAnnotation(hobby = {"篮球","唱跳","Rap"})   =>   @MyAnnotation(hobby = "篮球")

@MyAnnotation(value = "周",hobby = {"篮球","唱跳","Rap"})
public class Test {
    public static void main(String[]args){
        
        Test test = new Test();
        test.fan("小周");
    }
    
    private String name;
    
    public void fan(String name){
        System.out.println(name + "你好~");
    }

下篇笔记:自定义注解结合反射赋予实际作用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值