前言:
刚刚开始的新手Java开发者都会分不清注释与注解的区别,总是会混淆。那么注释和注解又有什么样的区别呢?
一、注释
1、定义
给人看的,便于阅读代码,对代码的描述。
2、用法
//
:对一句代码句的注释
/**/
:对段代码块的注释
/** */
:文档注释
二、注解Annontation
1、定义
对代码的描述,作为代码形式保留下来。
(Annontation像一种修饰符一样,应用于包,类型,构造方法,方法,成员变量,参数以及本地变量 的声明语句中)
2、作用
1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
2、跟踪代码依赖性,实现替代配置文件功能。比如Spring的注入,未来java开发,将大量注解配置,具有很大用处;
3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出
注解的本质: 特殊的接口
声明注解: 创建了一个特殊接口,通过反射获取注解
使用注解: @注解名(创建注解的一个对象)
3、原理
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池
这个运行时生成的动态代理对象是可以导出到文件的,方法有两种
- 在代码中加入System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles”,
“true”);- 在运行时加入jvm 参数 -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true
4、注解的分类
4.1 内置注解
定义:
jdk定义好这个注解的声明, 开发者直接使用, 语法检查
(1) @Override
检测重写
public class Run1 implements Runnable{
@Override
public void run() {
System.out.println("重写父类Runnable的run()方法");
}
}
(2) @Deprecated
已过时, 只是一个标志, 还是能够使用
-
/**
* This method is deprecated and should not be used because SQL Date
* values do not have a time component.
*
* @deprecated
* @exception java.lang.IllegalArgumentException if this method is invoked
* @see #setHours
*/
@Deprecated //已弃用
public int getHours() {
throw new java.lang.IllegalArgumentException();
}
(3) @SuppressWarnings("all")
抑制编译器生成警告信息