博客
关于我
面试题十九:Java高级面试 — 注解(另:Java注解)
阅读量:591 次
发布时间:2019-03-11

本文共 3569 字,大约阅读时间需要 11 分钟。

Java注解详解

一、注解概念

1.1、概念一

在Java编程中,注解是一种元数据的关联方式。它允许程序在元程序中关联任何信息和任何元数据(metadata)。简单来说,注解可以看作是一种接口,程序可以通过反射获取指定元素的注解对象,然后通过这个注解对象来获取注解里面的元数据。注解自JDK5.0起引入,它不仅可以用来创建文档,还可以用来跟踪代码的依赖性。注解的基本规则是:无论增加或删除注解,程序代码都不会受到影响,始终保持一致性。

1.2、概念二

在开发过程中,我们经常接触各种注解。例如,Java自带的@Override,第三方框架如butterknife的@BindView、retrofit的@Get,以及Spring的@Autowired等。这些注解为我们简化了代码编写,提高了开发效率。但对注解的定义是否清晰呢?根据维基百科的定义,注解是一种语法元数据,可以添加到Java源代码中。元数据是什么?元数据可以理解为描述其他数据的数据。例如,书的作者、文件的大小、图片的颜色等都可以看作是元数据。在Java中,元数据用于描述代码的各种元素,如类、方法、变量和包等。与Javadoc的注释不同,注解是直接作为代码形式存在的,可以用来描述代码元素,并且可以在编译时或运行时处理。

2、元数据(Metadata)的含义

元数据是描述数据的数据。在Java中,元数据可以以标签的形式存在于代码中,并且具有类型安全性。元数据需要编译器之外的工具进行处理,才能生成其他程序部件。与源代码编译成的class文件中的元数据不同,元数据也可以存在于编译后的class文件内部。

3、注解分类

3.1、系统内置标准注解

Java自带了一系列标准注解,用于描述代码元素的特性。例如:

  • @Override:用于检查方法是否是重载。如果在父类或实现的接口中没有找到原型,编译器会报错。
  • @Deprecated:标记方法已弃用,如果使用会提示编译器。
  • @SuppressWarnings:用于忽略编译器的警告,例如@SuppressWarnings("unused")

3.2、元注解

元注解是用来注解其他注解的注解。通过定义元注解,可以自定义注解的属性。常用的元注解包括@Document@Target@Retention@Inherited。例如:

@Document@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface Test {    public String name() default "";}
  • @Document:标记注解应被Javadoc工具记录,默认情况下Javadoc不包括注解。
  • @Target:描述注解的使用范围,常用ElementType enums如TYPEMETHODFIELD等。
  • @Retention:描述注解的存活时间,常用RetentionPolicy enums如SOURCECLASSRUNTIME
  • @Inherited:标记注解可被子类继承。

3.3、自定义注解

通过@interface关键字可以自定义注解。注解的每个方法实际上是配置参数的定义,方法名即为参数名,返回类型即为参数类型。可以通过default语法设定参数的默认值。如果注解只有一个参数,最好将参数名设为value,这样可以简化使用方式。

3.4、注解示例

以butterknife的BindView注解为例:

@Retention(CLASS)@Target(FIELD)public @interface BindView {    @IdRes int value();}

通过@BindView注解,可以减少findViewById操作,例如:

BindView(R.id.title) TextView title;

二、注解分类

三、注解实战

3.1、CherryAnnotation

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface CherryAnnotation {    public String name();    int age() default 18;    int[] score();}

3.2、Student类

public class Student {    @CherryAnnotation(name = "小明", age = 13, score = {99, 88, 77})    public void study(int times) {        for (int i = 0; i < times; i++) {            LogUtils.e("Good Good Study, Day Day Up!");        }    }}

3.3、AnnoTest1Activity

public class AnnoTest1Activity extends AppCompatActivity {    @BindView(R.id.tv)    TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_anno_test1);        ButterKnife.bind(this);        testAnnotation();    }    public void testAnnotation() {        try {            Class stuClass = Class.forName("com.gs.common4.annotation.Student");            Method stuMethod = stuClass.getMethod("study", int.class);            if (stuMethod.isAnnotationPresent(CherryAnnotation.class)) {                CherryAnnotation cherryAnnotation = stuMethod.getAnnotation(CherryAnnotation.class);                LogUtils.e("name: " + cherryAnnotation.name() + ", age: " + cherryAnnotation.age() +                         ", score: " + cherryAnnotation.score()[0]);            } else {                System.out.println("Student类上没有配置CherryAnnotation注解!");            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (NoSuchMethodException e) {            e.printStackTrace();        }    }}

四、面试题

4.1、为什么使用注解的形式?

注解的形式可以显著加快Android开发效率。通过其提供的注解API,可以在任何地方使用,大大减少无关痛痒的代码量,让开发者能够专注于真正的业务逻辑开发。注解的使用还能提高代码的简洁性,从而提升代码的稳定性和后期维护成本。

4.2、注解的原理?

注解的实现依赖于反射机制。在运行时,Java虚拟机(JVM)可以通过反射获取注解信息,并执行相应的逻辑。例如,通过反射可以获取注解对象,并调用其方法处理相应的逻辑。

4.3、会不会影响执行效率?

不会,注解不会影响执行效率。因为注解是在编译器阶段生成额外的代码,这些代码是直接嵌入到最终的class文件中。在运行时,注解信息不会占用额外的内存空间,并且处理速度也不会有明显影响。

转载地址:http://efttz.baihongyu.com/

你可能感兴趣的文章
NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
查看>>
nvidia 各种卡
查看>>
Nvidia 系列显卡大解析 B100、A40、A100、A800、H100、H800、V100 该如何选择,各自的配置详细与架构详细介绍,分别运用于哪些项目场景
查看>>
NVIDIA-cuda-cudnn下载地址
查看>>
nvidia-htop 使用教程
查看>>
nvidia-smi 参数详解
查看>>
Nvidia驱动失效,采用官方的方法重装更快
查看>>
nvmw安装node-v4.0.0之后版本的临时解决办法
查看>>
nvm切换node版本
查看>>
nvm安装 出现 Error retrieving “http://xxxx/SHASUMS256.txt“: HTTP Status 404 解决方法
查看>>
nvm安装以后,node -v npm 等命令提示不是内部或外部命令 node多版本控制管理 node多版本随意切换
查看>>
NXLog采集windows日志配置conf文件
查看>>
ny540 奇怪的排序 简单题
查看>>
NYOJ -216 A problem is easy
查看>>
NYOJ 1066 CO-PRIME(数论)
查看>>
NYOJ 737:石子合并(一)(区间dp)
查看>>
nyoj 91 阶乘之和(贪心)
查看>>
nyoj------203三国志
查看>>
NYOJ-525 一道水题
查看>>
NYOJ127星际之门(一)
查看>>