java基础知识——注解

1,JAVA 注解

注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。

个人理解:根据注解自动运行对应代码,编译时,根据注解进行操作或者提示,进一步看spring框架中注解

1,内置注解

Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。

作用在代码的注解是

  • @Override: 只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
  • @Deprecated: 建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
  • @SuppressWarnings: 这一个类型可以来暂时把一些警告信息消息关闭.

作用在其他注解的注解(或者说 元注解)是:

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
  • @Documented - 标记这些注解是否包含在用户文档中。
  • @Target - 标记这个注解应该是哪种 Java 成员。
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

从 Java 7 开始,额外添加了 3 个注解:

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次

常用注解

@Deprecated  -- @Deprecated 所标注内容,不再被建议使用。
@Override    -- @Override 只能标注方法,表示该方法覆盖父类中的方法。
@Documented  -- @Documented 所标注内容,可以出现在javadoc中。
@Inherited   -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
@Retention   -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。
@Target      -- @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。
@SuppressWarnings -- @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。

2,Annotation 结构

Annotation就是个接口

img

  1. ElementType 指定注解应用于哪一种元素:
  • TYPE, /* 类、接口(包括注释类型)或枚举声明 */

    FIELD, /* 字段声明(包括枚举常量) */

    METHOD, /* 方法声明 */

    PARAMETER, /* 参数声明 */

    CONSTRUCTOR, /* 构造方法声明 */

    LOCAL_VARIABLE, /* 局部变量声明 */

    ANNOTATION_TYPE, /* 注释类型声明 */

    PACKAGE /* 包声明 */

  1. RetenPolicy 每个注释只有一种策略:
  • SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */

    CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */

    RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */

3,注解作用

  1. 编译检查:

    例如,@SuppressWarnings, @Deprecated 和 @Override 都具有编译检查作用

class override {
    /*
        测试override
     */
    @Override
    public  String toString()
    {
        return "该方法覆盖于父类";
    }
    public String getString()
    {
        return "该方法没有曾被声明过,不能被@Override 修饰";
    }
    public static void main(String[] args) {

    }
}
  1. 在反射中使用 Annotation

​ 在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口。

这也意味着,我们可以在反射中解析并使用 Annotation

//自定义注解实现一个sql语句的拼接
/**
*自定义注解一般可以分为三步: 定义注解,使用注解,读取注解
*
/
//定义注解
package test;

import java.lang.annotation.*;

@Documented
@Target({ElementType.TYPE, ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaion {
    String getValue() default "this is myAnntaion";
    int order() default 0;
}

//使用注解
package test;// 将自定义的注解加在用户上,实现一个表的映
@MyAnnotaion(getValue = "annotation on class")
public class Demo {

    @MyAnnotaion(getValue = "annotation on filed")
    public String name;

    @MyAnnotaion(getValue = "annotation on method")
    public void hello(){
    }

    @MyAnnotaion
    public void defaultMethod(){

    }
}


//使用反射查看注解
package test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestDemo {
    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
        /**
         * 获取类上的注解
         */
        Class<Demo> demoClass = Demo.class;
        Annotation[] annotaion = demoClass.getAnnotations();
        printAnnotation(annotaion);

        /**
         * 读取成员变量上的注解
         */
        Field name = demoClass.getField("name");
        Annotation[] getOnFiled = name.getAnnotations();
        printAnnotation(getOnFiled);

        /**
         * 读取方法上的注解
         */
        Method hello = demoClass.getMethod("hello", null);
        MyAnnotaion onMethod = hello.getAnnotation(MyAnnotaion.class);
        System.out.println(onMethod.getValue());

        /**
         * 获取默认方法上的注解
         */
        Method defaultMethod = demoClass.getMethod("defaultMethod", null);
        MyAnnotaion onDefaultMethod = defaultMethod.getAnnotation(MyAnnotaion.class);
        System.out.println(onDefaultMethod.getValue());

    }

    public static void printAnnotation(Annotation... annotations) {
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
    }
}



 /*
 结果
 @test.MyAnnotaion(getValue="annotation on class", order=0)
@test.MyAnnotaion(getValue="annotation on filed", order=0)
annotation on method
this is myAnntaion
 /

  1. 根据 Annotation 生成帮助文档

​ 通过给 Annotation 注解加上 @Documented 标签,能使该 Annotation 标签出现在 javadoc 中。

  1. 能够帮忙查看查看代码

​ 通过 @Override, @Deprecated 等,我们能很方便的了解程序的大致结构。另外,我们也可以通过自定义 Annotation 来实现一些功能。

本次学习:

  1. 每个Java只能有一个public类,可使用内部类
  2. java IEDA 与其他编译的区别 ,多个模块的概念

4,注解与注释的区别

可以被其他程序(比如:编译器等)读取。(注解信息处理流程,是注解和注释的重大区别,如果没有注解信息处理流程,则注解毫无意义)

注解在编译时,可进行对于操作

①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查

注解可以附加在 package,class,method,field 等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素的访问。

2,参考:

(177条消息) Java注释和注解的区别_赵广陆的博客-CSDN博客_java注释和注解的区别

Java 注解(Annotation) | 菜鸟教程 (runoob.com)

(177条消息) Java 注解的作用与使用_记忆力不好的博客-CSDN博客

[java注解的使用 - chenweicool - 博客园 (cnblogs.com)](https://www.cnblogs.com/chentang/p/13959831.html#:~:text=Java注解是附加在代码中的一些元信息,用于编译和运行时进行解析和使用,起到说明、配置的功能。 注解不会影响代码的实际逻辑,仅仅起到辅助性的作用。 包含在java.lang.annotation包中。,注解的定义类似于接口的定义,使用%40interface来定义,定义一个方法即为注解类型定义了一个元素,方法的声明不允许有参数或throw语句,返回值类型被限定为原始数据类型、字符串String、Class、enums、注解类型,或前面这些的数组,方法可以有默认值。 注解并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。 它会反过来对正在运行的程序语义有所影响。 注解可以从源文件、class文件或者在运行时通过反射机制多种方式被读取。)

推荐:

(177条消息) Java注解与注释_coddffee的博客-CSDN博客_java注解和注释

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值