

day30-注解 - 一刀一个小西瓜
source link: https://www.cnblogs.com/liyuelian/p/16647530.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java注解
1.注解的理解
- 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息
- 和注释一样,注解不影响程序逻辑,但注解可以被编译或者运行,相当于嵌入在代码中的补充信息
- 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
基本的Annotation介绍:
使用Annotation时要在其前面添加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素
-
三个基本的Annotation:
-
@Override:限定某个方法,是重写父类方法,该注释只能用于方法
-
@Deprecated:用于表示某个程序元素(类、方法等)已过时
-
@SuppressWarnings:抑制编译器警告
-
2.@Override注解
package li.annotation; public class Override_ { public static void main(String[] args) { }}class Father{//父类 public void fly(){ System.out.println("Father fly ..."); }} class Son extends Father{//子类 //@Override 放在fly方法上,表示子类的fly方法重写了父类的fly方法 //即使这里没有写@Override,其实还是重写了父类方法 //但是如果写了@Override注解,编译器就会检查该方法是否整的重写了父类的方法。 //如果的确重写了就编译通过,如果没有构成重写则编译错误 //它的意义就在于语法的校验 @Override public void fly(){ System.out.println("Son fly ..."); }}
@Override使用说明:
- @Override表示指定重写父类的方法(从编译层面验证),如果父类没有fly方法,则会报错
- 如果不写@Override注解,而父类仍有 public void fly(){},仍然构成重写
- @Override只能修饰方法,不能修饰其他类、包、属性等等
- 查看@Override注解源码为
@Target(ElementType.METHOD)
,说明只能修饰方法 - @Target是修饰注解的注解,称为元注解
点击@Override进去可以看到Override的定义:

补充说明:@interface
的说明
@interface
不是接口,是注解类 ,在JDK1.5之后加入的
3.@Deprecated注解
Deprecated用于表示某个程序元素(类、方法等)已经过时
package li.annotation; public class Deprecated_ { public static void main(String[] args) { AAA a = new AAA(); a.hi(); System.out.println(a.n1); }} // @Deprecated 修饰某个元素,表示该元素已经过时// 即 不再推荐使用,但是仍然可以使用@Deprecatedclass AAA{ @Deprecated public int n1 = 10; @Deprecated public void hi(){ }}
查看@Deprecated注解类的源码:

@Deprecated使用说明:
- 用于表示某个程序元素(类、方法等)已过时
- @Deprecated可以修饰CONSTRUCTOR(构造器), FIELD(属性), LOCAL_VARIABLE(局部变量), METHOD(方法), PACKAGE(包), PARAMETER(参数), TYPE(类型)
- @Deprecated的作用可以做到新旧版本的兼容和过渡
3.@SuppressWarnings注解
@SuppressWarnings属性介绍及属性说明:(部分)
属性 | 属性说明 |
---|---|
all | 抑制所有警告 |
boxing | 抑制装箱、拆箱操作时候的警告 |
cast | 抑制映射相关的警告 |
dep-ann | 抑制启用注释的警告 |
deprecation | 抑制过期方法警告 |
fallthrough | 抑制确在switch中缺失breaks的警告 |
finally | 抑制finally模块没有返回的警告 |
hiding | 抑制与隐藏变数的区域变数相关的警告 |
incomplete-switch | 忽略没有完整的switch语句 |
nls | 忽略非nls格式的字符 |
null | 忽略对null的操作 |
rawtypes | 忽略没有指定泛型的警告(传参时没有指定泛型的警告错误) |
restriction | 抑制使用不建议或禁止参照相关的警告 |
serial | 抑制与实现序列化的类遗漏serialVersionUID的的警告 |
static-access | 抑制不正确的静态访问方式警告 |
synthetic-access | 抑制子类没有按最优方法访问内部类的警告 |
unchecked | 抑制没有进行类型检查操作的警告 |
unqualified-field-access | 抑制没有权限访问的域的警告 |
unused | 抑制没被使用过的代码的警告 |
package li.annotation; import java.util.ArrayList;import java.util.List; // 1.当我们不希望看到警告时,可以使用@SuppressWarnings注解来抑制警告信息// 2.在{""}中,可以写入你希望抑制(不显示)的警告信息// 3.@SuppressWarnings的作用范围和你放置的位置有关// 比如 @SuppressWarnings放置在main方法,那么抑制警告的范围就是main方法 public class SuppressWarnings_ { @SuppressWarnings({"all"}) public static void main(String[] args) { List list = new ArrayList(); list.add("jack"); list.add("mary"); list.add("Bob"); System.out.println(list);//[jack, mary, Bob] }}
查看@SuppressWarnings源码:

-
@SuppressWarnings可以放置的位置有:TYPE(类型), FIELD(属性), METHOD(方法), PARAMETER(参数), CONSTRUCTOR(构造器), LOCAL_VARIABLE(局部变量)
-
该注解类有一个数组
String[] value()
,通过该数组可以在@SuppressWarnings({""})
中设置多个属性,如@SuppressWarnings({"rawtypes","unchecked","unused"});
4.元注解
元注解的基本介绍:
JDK的元Annotation用于修饰其他Annotation
元注解的种类:
-
Retention:指定注解的作用范围,三种:SOURCE,CLASS,RUNTIME
-
Target:指定注解可以在哪些地方使用
-
Documented:指定该注解是否会在javadoc中体现
-
Inherited:子类会继承父类注解
4.1@Retention注解
只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:
@Rentention的三种值:
- RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注解
- RetentionPolicy.CLASS:编译器把注解记录在class文件中,当运行Java程序时,JVM不会保留注解。这是默认值
- RetentionPolicy.RUNTIME:编译器把注解记录在class文件中,当运行Java程序时,JVM会保留注解。程序可以通过反射来获取该注解


4.2@Target注解
基本说明:
用于修饰Annotation定义,用于指定 被修饰的Annotation可以用于修饰 哪些程序元素
@Target也包含一个名为value的成员变量
@Documented@Retention(RetentionPolicy.RUNTIME)//它的作用范围是RUNTIME@Target(ElementType.ANNOTATION_TYPE)//这里的ANNOTATION_TYPE 说明@Target只能修饰注解public @interface Target {//注释类 /** * Returns an array of the kinds of elements an annotation type * can be applied to. * @return an array of the kinds of elements an annotation type * can be applied to */ ElementType[] value();}
4.3@Documented注解
基本说明:
@Documented:用于指定被该元Annotation修饰的Annotation类将被 javadoc工具提取生成文档,即在生成文档时,可以看到该注解。
PS:定义为@Documented的注解必须设置Retention值为RUNTIME

4.4@Inherited注解
被它修饰的Annotation将具有继承性,如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解

Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK