专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
芋道源码  ·  老板给我工作,还给我发工资,他图什么? ·  3 天前  
芋道源码  ·  阿里也出手了!Spring Cloud ... ·  4 天前  
Java编程精选  ·  前美团员工自曝:35岁被裁后gap一年多,身 ... ·  1 周前  
芋道源码  ·  实用指南:解决 SpringBoot ... ·  6 天前  
芋道源码  ·  10月面试的兄弟看看吧。。 ·  6 天前  
51好读  ›  专栏  ›  java那些事

深入分析 java注解。让你快走一步!

java那些事  · 公众号  · Java  · 2017-02-18 16:40

正文



java元注解

元注解作用是负责注解其他注解,java5.0定义了四个标准的元注解。包括:@Target、@Documented、@Retention、@Inherit。

@Target注解:它用于描述注解可以修饰的类型。可以修饰的类型为:TYPE(类、接口、枚举)、FIELD、METHOD(方法声明)、PARAMETER(参数)、CONSTRUCTOR(构造方法)、LOCAL_VARIABLE(本地变量)、ANNOTATION_TYPE(注解类型声明)、PACKAGE(包)。

其代码如下所示: 

@Retention注解:用于表示该注解的作用阶段。其参数可以取RetentionPolicy中的值。如: 
SOURCE:作用于源代码中,编译阶段被去除。 
CLASS:可以被编译进Class文件中,但是虚拟机对其忽略。 
RUNTIME:可以被编译进Class文件,虚拟机在运行期使用。

其代码为: 

@Documented注解:用于在生成API文档的时候,使得该注解可以呈现在使用该注解的API上。 

@Inherit注解:是一个标记注解,用于描述一个注解可以被继承。如果一个类使用了(@Interit标注的注解)的话,那么该注解可以被该类的子类继承。 
如果使用反射去查找一个标注了@Inherit注解的类的时候,反射代码会检查该类及其父类,直到找到标注了该注解的顶层类。

其代码如下: 

自定义注解

根据上面的元注解我们可以定义自己的注解,注解在定义的时候,可以指定其不同的参数,以及该参数的默认值。

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface PersonAnno {

   String name() default "";    int age() default 0;
}123456789123456789

这里自己定义了一个注解,其中添加了两个参数,分别是name和age并设置了默认值。

根据上面定义的注解,其保留到运行时,且标注于方法上。

public class Person {
   @PersonAnno(name = "wy", age = 20)    public void getPerson() {
   }
}1234512345

下面针对该注解进行测试

public class MainTest {    public static void main(String[] args) throws Exception {

       Person person = new Person();
       Class pers = person.getClass();        // 反射拿到方法
       Method method= pers.getDeclaredMethod("getPerson");        // 获取注解
       PersonAnno ana = method.getAnnotation(PersonAnno.class);
       System.out.println(ana.name() + ":" + ana.age());
   }
}12345678910111213141234567891011121314

输出结果如下:

wy:2011

注解本质

本质上注解会被编译为继承了(Annotation接口)的接口。 
反编译上面的PersonAnno.class可以看到代码如下: 
 
从上面的反编译后的代码可以看出注解实际上被编译为接口了。

/**
* The common interface extended by all annotation types.  Note that an
* interface that manually extends this one does not define
* an annotation type.  Also note that this interface does not itself
* define an annotation type.
*
* More information about annotation types can be found in section 9.6 of
* The Java™ Language Specification.
*
* @author  Josh Bloch
* @since   1.5
*/public interface Annotation {}1234567891011121312345678910111213

这里Annotation接口中已经给出了说明,该接口被所有的注解类型的接口继承。

推荐程序员必备微信号 


程序员内参
微信号:

programmer0001



推荐理由:
在这里,我们分享程序员相关技术,职场生活,行业热点资讯。不定期还会分享IT趣文和趣图。这里属于我们程序员自己的生活,工作和娱乐空间。


 ▼长按下方↓↓↓二维码识别关注