Java个人 @元注解@系统注解梳理

写篇CSDN理解下Java自己不会的知识点.SE阶段在最后的几章理解比较混乱,不知道从哪儿开始重新复习,列了下自己混乱的知识点,理了理思路,决定还是先从简单的注解开始了,起码不打击自己自信心.

多数知识点借鉴菜鸟教程(https://www.runoob.com/w3cnote/java-annotation.html)

靠着教程讲的去了解思路.结合自己实践得出的看法,

 

什么是Java 注解 (Annotation )

读法:an ner tei shen

Java注解是JDK5.0引入的一种注释机制,注解可以在Java中的各个位置上,同时支持获取运行中系统的标注和自定义Java标注.

注解分为 7个 3个系统注解 ,4个元注解

自定义注解

注解的组成部分

3个重要的主干类

 公共接口注释提供对外的使用方法

公共枚举类型  里面是注解要使用到的方法的属性,即制定注解的类型

注释文件的存储方式

 

 这里先说下自定义注解  自己写了一遍注解,感觉对注解的理解又深了一部分

一般注解都是搭配反射的解析器共同工作的,然后利用反射机制查看类的注解内容,代替配置文件来查看信息.

注解:

import static java.lang.annotation.ElementType.METHOD; //方法
import static java.lang.annotation.ElementType.TYPE;  //类型
import static java.lang.annotation.RetentionPolicy.RUNTIME; //运行时


//下面这三个是注解的注解即元注解,用来标识注解用处
import java.lang.annotation.Documented;//导入Docunmented注解
import java.lang.annotation.Retention;// retention注解
import java.lang.annotation.Target;//target注解


引用导入的注解
@Documented
@Retention(RUNTIME)//这里就是运行时
@Target({ TYPE, METHOD }) //这里是类型上 和方法上
public @interface MyAnnotation {  //定义自定义注解用@interface  起名 为"MyAnnotation" 
	public String name() default ""; //定义默认值,
	public int age() default 18;
}

测试类:

@MyAnnotation(name="mc",age=18) //赋值 name String类型, age int类型
public class Test1 { //测试类
	
	public static void getNameAndAge() { //定义一个静态获取名字的方法
		//里面没有任何方法和构造方法.
	}
	

	public static void main(String[] args) {  
		Class<Test1> test=Test1.class;    
		boolean testHasAnnotation=
        // isAnnotationPresent(annotation.class):判断该程序元素上是否包含指定类型的注解
				test.isAnnotationPresent(MyAnnotation.class);
		if(testHasAnnotation) {
        //  getAnnotations():返回该程序元素上存在的所有注解
			MyAnnotation myAnnation=test.getAnnotation(MyAnnotation.class);
			System.out.println("name="+myAnnation.name()+"  年龄="
					+myAnnation.age());
		}
	}
}

结果输出是 name = mc  年龄=18;

 

作用在代码的注解

 

                                                                                       基本系统注解

            系统注解      作用               举例                                 用处
@SupperessWarnings强压警告"All"    放在类上为压制类下的所有黄色警告瞬间清爽,像任务上线的时候,不能有黄色警告,可以加个压制
@Deprecated过时方法警告 如下 : "Stop()"方法 在API文档上显示 标记方法是否过期,进行标注
@Override无继承方法编译警告用工具编写方法时自动生成的

1)帮助自己检查是否正确的重写父类方法

2)明显的提示看代码的人,这是重写的方法

 

注解1:  @Override  检查该方法是否重写方法,如果发现其父类,或者是引用的接口没有该方法的时候,会报编译异常时候的错误.

这样就能解释我的情况 :  以前在写Android编程的时候,总是会发现在自己代码无误的情况下报错,问题也找不到.最后通过删除注解得到了解决,(Android的后台也是Java实现的).同样在入门Java后,也发生过这种问题,凭着自己经验,指出是注解 @Override的问题,删除掉,问题立马就好了,但是还是不知道原理.也不知道大家有没有疑惑过.

个人觉得是他检查了子类是否实现 父类或者实现接口的方法,但是Java本身就是层层继承的,万物的根——Objects,检查肯定是有的,就看编译判断的是那个类的实现和继承了,如果没有判断正常,就会出现时而报错,时而无异常的情况.

 

注解2: @Deprecated    标记过时的方法,如果使用会报编译警告

如:线程的stop()方法,能用是能用,就是加了个中线,看上去不舒服.

 

 注解3: @SupperessWarnings  指示编译器忽略注解中的声明

这个是最舒服的,看见不顺眼的黄色警告,就直接在类上,强加上@SupperessWarnings(“All”) 瞬间就舒服了,只要是这个类下的,都弹不出来警告,.

 

作用在其他注解的注解, (元注解)

之前被吞了表格         

元注解名  作用      元素类型枚举类内变量属性 
@Documented注释成文档一般三者连用定义
@Retention标记存在的时长和位置RetentionPplicy

SOURCE  (源文件存活,运行直接移除)

CLASS      (在class上存活,运行时移除) 默认

RUNTIME  (字节码文件,运行时被仍然存活)

  

 

@Target 定义注释所修饰的类型ElementType

TYPE  用于描述类/接口(包括注解类型)或者enum  枚举类声明Class或者接口),

FIELD  用来描述类,

METHOD  用来描述方法,

PARAMETER   用来描述参数,

CONSTRUCTOR 用来描述构造方法,

LOCAL_VARIABLE 用来描述局部变量,

ANNOTATION_TYPE  注解类型

PACKAGE 用来描述包

TYPE_PARAMETER 用来标注类型参数

TYPE_USE   能标注任何类型名称

@Inherited 标记注释可以被子类继承  

 

什么是元注解, 就是作用在注解上的注解,用来标识注解的用处,即修饰作用

 注解1: @Retention  标识注解怎么保存的,是只在代码中,还是编入class文件中,或者在运行的时候通过反射访问. 标识注解被保存的时间的长短.

 在这个注解中,有三个值

RetentionPplicy. SOURCE 针对于 java源文件在源文件中有效保留,在编译class文件的时候基本注解被移除. 

RetentionPplicy. CLASS     针对于.class文件中,class文件中有效保留,在加载class文件的时候基本注解被移除 .

RetentionPplicy.RUNTIME  针对于 字节码文件,在运行时有效保留,因为不管在文件中还是在编译后都存在,所以在虚拟机加载class文件的时候基本注解不会被移除.

 

 注解2: @Target 标记 这个注解是Java的成员 定义注解的作用目标

跟@Retention @Inherited 连用,描述的是注解可以用在什么地方,如果只定义在方法类型,那么定义的注解只能用来方法上,其他类型同理

 

 注解3: @Inherited 标记这个注解是继承与该注解类,替代注解并没有继承子类

跟@Retention @Target  连用指示此类型是自动继承的

类继承关系中,子类会自动继承父类使用的注解中被@Inherited修饰的注解,不管有没有修饰.

但是 接口实现中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰

类实现接口时不会继承任何接口中定义的注解

 

最后了解下注释的作用

       辅助类,主要在Junit, Struts, Spring 等工具框架中使用

                  编程中用到的 @SuppressWarning @Deprecated @Override 就是编译时的检查

        在反射中使用

                   在反射的Class Method ,Field等函数,有很多Annotation相关的接口意味着可以再反射中使用Annotation

       根据Annotation生成帮助文档 

                   使注解也能出现在javadoc中

       能够查看代码

 

感觉自己理解的还是不够,深入但是,写完博客感觉有一些理解了,能阅读基本的注解的作用.不会出现阅读障碍,虽然还是写起来比较困难,大部分应该是来源于反射吧,反射也是没有搞清楚,之前对注解方面的没有仔细听,总感觉比较困难,现在看也不过尔尔.接下来就理解反射吧.这个后面学习过程中,应该也会涉及到框架等.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值