Java注解

Java注解
(Annotation)
(1) Annotation(注释)是JDK5.0及以后版本引入的。
它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。
注释是以‘@注释名’在 代码中存在的,
根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。
它们都不会直接影响到程序的语义,只是作为注释(标识)存在,
我们可以通过反射机制编程实现对这些元数据的访问。
另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。
元数据的作用
如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,
大致可分为三类:编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查
一般注解可以分为三类:
一类是Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings
分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
一类为元注解,元注解是用于定义注解的注解
包括@Retention、@Target、@Inherited、@Documented,@Retention用于标明注解被保留的阶段,
@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档
一类为自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。
@Override 用在方法上,表示这个方法重写了父类的方法,如toString()。
如果父类没有这个方法,那么就无法编译通过,如例所示,在fromString()方法上加上@Override 注解,就会失败,因为Hero类的父类Object,并没有fromString方法。
*@Overide并不是必须的。但是还是建议使用这个注解
比如:
1 public class Hero {
2
3 String name;
4 @Override
5 public String toString(){
6 return name;
7 }
8 @Override
9 public String fromString(){
10 return name;
11 }
12 }

@SuppressWarnings用来抑制编译器生成警告信息。
可以修饰的元素为类,方法,方法参数,属性,局部变量
使用场景:当我们一个方法调用了弃用的方法或者进行不安全的类型转换,编译器会生成警告。
我们可以为这个方法增加@SuppressWarnings注解,来抑制编译器生成警告。
注意:使用@SuppressWarnings注解,采用就近原则。
比如一个方法出现警告,我们尽量使用@SuppressWarnings注解这个方法,而不是注解方法所在的类。虽然两个都能抑制编译器生成警告,但是范围越小越好,
因为范围大了,不利于我们发现该类下其他方法的警告信息。

比如:
@SuppressWarnings
public void methodWithWarning() {
}

可以用来标记类,方法,属性。
如果上述三种元素不再使用,使用@Deprecated注解
如果代码使用了@Deprecated注解的类,方法或属性,编译器会进行警告。

@Deprecated使用很简单,如下为注解一个弃用的类。
1@Deprecated
2 public class MyComponent {
3 }
当我们使用@Deprecated注解后,建议配合使用对应的@deprecated JavaDoc符号,并解释说明为什么这个类,方法或属性被弃用

1 @Deprecated
2 @deprecated This class is full of bugs. Use MyNewComponent instead.
3 public class MyComponent {
4 }

@Retention
@Retention是用来修饰注解的注解,使用这个注解,我们可以做到

控制注解是否写入class文件
控制class文件中的注解是否在运行时可见
控制很简单,使用使用以下三种策略之一即可。

RetentionPolicy.SOURCE 表明注解仅存在源码之中,不存在.class文件,更不能运行时可见。常见的注解为@Override, @SuppressWarnings。
RetentionPolicy.CLASS 这是默认的注解保留策略。这种策略下,注解将存在与.class文件,但是不能被运行时访问。通常这种注解策略用来处于一些字节码级别的操作。
RetentionPolicy.RUNTIME 这种策略下可以被运行时访问到。通常情况下,我们都会结合反射来做一些事情。
@Retention的使用示例

1import java.lang.annotation.Retention;
2import java.lang.annotation.RetentionPolicy;
3@Retention(RetentionPolicy.RUNTIME)
4@interface MyAnnotation {
5 String value() default “”;
6 }

@Target
使用@Target注解,我们可以设定自定义注解可以修饰哪些java元素。

1import java.lang.annotation.ElementType;
2import java.lang.annotation.Target;
3@Target({ElementType.METHOD})
45public @interface MyAnnotation {
5 String value();
6 }

@Target可以选择的参数值有如下这些
ElementType.ANNOTATION_TYPE(注:修饰注解)
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE(注:任何类型,即上面的的类型都可以修饰)

@Inherited

*如果你想让一个类和它的子类都包含某个注解,就可以使用@Inherited来修饰这个注解。

1java.lang.annotation.Inherited
2@Inherited
3public @interface MyAnnotation {
4 }
1@MyAnnotation
2public class MySuperClass { … }
3public class MySubClass extends MySuperClass { … }

上述代码的大致意思是

使用@Inherited修饰注解MyAnnotation
使用MyAnnotation注解MySuperClass
实现一个类MySubclass继承自MySuperClass

按照作用域分根据注解的作用域@Retention,注解分为
RetentionPolicy.SOURCE: Java源文件上的注解
RetentionPolicy.CLASS: Class类文件上的注解
RetentionPolicy.RUNTIME: 运行时的注解
按照来源分
1.内置注解 如@Override ,@Deprecated 等等
2.第三方注解,如Hibernate, Struts等等
3.自定义注解,如仿hibernate的自定义注解

注意:
1.要用好注解,必须熟悉java 的反射机制,注解的解析完全依赖于反射。
2.不要滥用注解。平常我们编程过程很少接触和使用注解,只有做设计,且不想让设计有过多的配置时。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值