栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java学习笔记之注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java学习笔记之注解

目录

什么是注解

注解的作用

Java预置注解

Java元注解

注解的本质

 注解与反射的使用場景

 问题思考


对于Java语言开发者而言注解必不陌生。那么注解到底是什么?有什么用?同时其本质又是什么?

什么是注解

注解是JDK1.5的新特性用来说明程序的。使用语法:

@注解名称

注解的作用

编写文档:通过代码里标识的注解生成文档 [生成doc文档]

javadoc -encoding UTF-8 DocAnno.java

public class DocAnno {

    
    public int add(int s1, int s2){

        return s1 + s2;
    }
}

代码分析:通过代码里标识的注解对代码进行分析 [结合使用反射]

编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查 [@Override]

Java预置注解

@Override:检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated:该注解标注的内容,表示已过时

@Suppress Warnings:压制警告,一般传递参数“all”

@FunctionalInterface:1.8之后才有,函数式接口,使用该注解之后接口必须要有一个未实现方法。

@FunctionalInterface
interface FunctionInterfaceTest{
    void doWork();
    default void doWork2(){}
}

Java元注解

元注解指的就是修饰注解的注解。

@Target:描述註解能夠作用的位置。

        ElementType.TYPE: 可作用在类上

        ElementType.METHOD: 可作用在方法上

        ElementType.FIELD: 可作用在成员变量上

@Retention:描述注解被保留到的阶段

        SOURCE: 表示当前注解只在代码阶段有效

        CLASS: 表示该注解会被保留到字节码阶段

        RUNTIME: 表示该注解会被保留到运行阶段JVM

@Document: 描述注解是否被抽取到JavaDoc的api中

@Inherited: 描述注解是否可以被子类继承

注解的本质

注解的本质其实是一个继承了java.lang.annotation.Annotation接口的接口。

通过反编译编译文件可以证实。

javap -v AnnoDemo

 注解中定义的方法就是注解的属性,同时其可以定义的属性有以下类型:

String,基本数据类型、Enum、Class、注解类型以及以上类型的数组类型。

public @interface AnnoDemo {
    String strValue();
    int intValue();
    int[] intArr();
}

 注解与反射的使用場景

在实际开发中框架也会使用注解与反射的结合,此处写一个例子利用反射获取成员的注解并获取注解的属性值

自定义注解 TestAnno

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnno {
    String value();
}

 使用自定义注解

public class HelloAnno {
    @TestAnno("测试反射获取注解属性值")
    private String name;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

 反射解析类对象获取特定注解属性值

public class TestUtil {

    public static void getAnnoAttrValue(Class clazz){
        Field[] fields = clazz.getDeclaredFields();
        for(Field field : fields){
            if(field.isAnnotationPresent(TestAnno.class)){
                TestAnno annotation = field.getAnnotation(TestAnno.class);
                System.out.println(annotation.value());
            }
        }
    }
}

 测试类

public class TestMain {
    public static void main(String[] args) {
        TestUtil.getAnnoAttrValue(HelloAnno.class);
    }
}

 问题思考

什么是注解处理器?

注解处理的原理是什么?

如何使用注解处理器?

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/914832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号