`
ttitfly
  • 浏览: 624022 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Annotation定义

    博客分类:
  • java
阅读更多

Annotation接口的实现类: Documented, Inherited, Retention, Target 都是用来定义自己定义的Annotation类的。

1. 注解(Annotation)类,以@interface  修饰 ,不能显示(explicit)extends或implements任何类

如:

java 代码
  1. public @interface DefineAnnotation {   
  2. }  

 

这种没有任何属性的Annotation类,也叫标识Annotation

2. 定义属性

java 代码
  1. //属性必须加个小括号   
  2. public String value() ;   
  3. //有默认值的属性   
  4. public String value() default "aaa";  

 

完整定义如下:

java 代码
  1. //注解Annotation类不能显示(explicit)extends或implements任何类   
  2. //不定义任何属性就叫maket annotation   
  3. public @interface DefineAnnotation {   
  4.   
  5.     //定义一个属性,有属性的话,必须赋值,除非有默认default   
  6.     public String value() default "aaa";   
  7.        
  8. }   

 

3.使用Annotation,有默认值的可以不用传参数,也可以传递参数。没有默认值的,必须传递参数。

如:

java 代码
  1. public class TestAnnotation {   
  2.   
  3. //  @DefineAnnotation 有默认值的第一种使用方式   
  4. //  @DefineAnnotation() 有默认值的第二种使用方式   
  5.     @DefineAnnotation("ttitfly")   
  6.     public void say(){   
  7.         System.out.println("say hello");   
  8.     }   
  9.     public static void main(String[] args){   
  10.         TestAnnotation ta = new TestAnnotation();   
  11.         ta.say();   
  12.     }   
  13. }   

 

4.  Retention (保存)

所有的Annotation类都实现了Annotation接口
@Retention本身就是个Annotation(注解)类
它的值是个enum枚举类型的RetentionPolicy,该枚举类型RetentionPolicy有三个值RUNTIME (会被JVM加载,并可以通过反射来获得到Annotation类的信息) ,CLASS (不会被JVM加载),Source
@Retention的值标识自己定义的Annotation(注解)类 是属于哪种保存策略,将来哪个类如果使用了这个自定义的注解类,将会使用这种保存策略

如:

java 代码
  1. import java.lang.annotation.Retention;   
  2. import java.lang.annotation.RetentionPolicy;   
  3. //所有的Annotation类都实现了Annotation接口   
  4. //@Retention本身就是个Annotation(注解)类   
  5. //它的值是个enum枚举类型的RetentionPolicy,该枚举类型RetentionPolicy有三个值RUNTIME (会被JVM加载,并可以通过反射来获得到Annotation类的信息) ,CLASS (不会被JVM加载),Source   
  6. //@Retention的值标识自己定义的Annotation(注解)类 是属于哪种保存策略,将来哪个类如果使用了这个自定义的注解类,将会使用这种保存策略   
  7. @Retention(RetentionPolicy.RUNTIME)   
  8. public @interface MyAnnotation {   
  9.   
  10.     String hello() default "ttitfly";   
  11.     String world();   
  12. }   

 

java 代码
  1. //使用自己定义的Annotation类   
  2. public class MyTest {   
  3.     //一个方法可以有多个注解类   
  4.     @Deprecated  
  5.     @MyAnnotation(hello="china",world="earth")   
  6.     public void say(){   
  7.         System.out.println("say hello");   
  8.     }   
  9.   
  10. }   

 

 

java 代码
  1. import java.lang.annotation.Annotation;       
  2. import java.lang.reflect.Method;       
  3.       
  4. public class TestMain {       
  5.     //可以通过AnnotatedElement来获得到Annotation类的信息。Method,Field等都是AnnotatedElement的实现类       
  6.     public static void main(String[] args) throws Exception {       
  7.                
  8.         MyTest mt = new MyTest();       
  9.         Class clazz = MyTest.class;       
  10.                
  11.                
  12.         //Method method = clazz.getMethod("say", null);//因为是无参数的,所以直接写个null也可以       
  13.         Method method = clazz.getMethod("say"new Class[]{});       
  14.         method.invoke(mt, new Object[]{});       
  15.                
  16.         //该方法是否使用了MyAnnotation这个注解类       
  17.         boolean isExist = method.isAnnotationPresent(MyAnnotation.class) ;       
  18.         if(isExist){       
  19.             MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);       
  20.             System.out.println(annotation.hello());       
  21.             System.out.println(annotation.world());       
  22.         }       
  23.                
  24.         Annotation[] annotations = method.getAnnotations();       
  25.         for(     Annotation    annotation   :    annotations   ){       
  26.             //打印出这样的结果:com.yahaitt.annotation.MyAnnotation       
  27.             System.out.println(annotation.annotationType().getName());       
  28.                    
  29.             //不能通过getClass().getName()的方式获得了。这样获得的结果类似这样的:$Proxy3,主要原因是因为Annotation在运行时刻,是通过java的动态代理实现的,   
  30.             //每次得到一个annotation,实际上并不是得到该annotation的实例,而是得到了它的一个代理,这个代理java在命名上采用的是$Proxy1,$Proxy2...的形式,数字是按照出现的顺序来定的   
  31.             //而getClass()方法返回的是该对象运行时刻所代表的真实对象,在这里也就是代理对象了   
  32.             System.out.println(annotation.getClass().getName());    
  33.                
  34.             //输出结果为:java.lang.reflect.Proxy   
  35.             System.out.println(annotation.getClass().getSuperclass().getName());     
  36.         }       
  37.                
  38.                
  39.     }       
  40. }     

 

5.继承(Inherited)

在自己定义的Annotation里加入一个@Inherited ,就标识了这个定义的Annotation是可以被继承的

java 代码
  1. import java.lang.annotation.Inherited;   
  2. import java.lang.annotation.Retention;   
  3. import java.lang.annotation.RetentionPolicy;   
  4. //在自己定义的Annotation里加入一个@Inherited ,就标识了这个定义的Annotation是可以被继承的   
  5. @Inherited  
  6. @Retention(RetentionPolicy.RUNTIME)   
  7. public @interface MyInherit {   
  8.     String value();   
  9. }   

 

java 代码
  1. @MyInherit("test class")   
  2. public class Parent {   
  3.     @MyInherit("test method")   
  4.     public void doSomething(){   
  5.         System.out.println("hello");   
  6.     }   
  7. }  

 

java 代码
  1. public class Child extends Parent{   
  2.   
  3. }   

 

java 代码
  1. import java.lang.reflect.Method;   
  2.   
  3.   
  4. public class TestInherit {   
  5.        
  6.     public static void main(String[] args) throws Exception{   
  7. //      Class< Parent > clazz = Parent.class;   
  8.         Class< Child > clazz = Child.class;   
  9.         if(clazz.isAnnotationPresent(MyInherit.class)){   
  10.             MyInherit myInherit = clazz.getAnnotation(MyInherit.class);   
  11.             System.out.println(myInherit.value());   
  12.         }   
  13.            
  14.         Method method = clazz.getMethod("doSomething"new Class[]{});   
  15.         if(method.isAnnotationPresent(MyInherit.class)){   
  16.             MyInherit myInherit = method.getAnnotation(MyInherit.class);   
  17.             System.out.println(myInherit.value());   
  18.         }   
  19.     }   
  20.   
  21. }   

 

输出结果为:

test class
test method

也就是说已经被继承了 。但是在方法上使用的Annotation也被继承了,这点有点不太明白,和文档有点冲突。

分享到:
评论
2 楼 forrest_lv 2011-12-19  
@Inherit指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止. Parent类上使用了注释@MyIherit,Parent的派生类Child将继承类上的注释@MyHerit.

注解@MyInherit用于方法Parent.doSomething()上,这个带指定注解@MyInherit的“***方法doSomething()***”是否可以被Parent的派生类Child所继承到(@MyInherit不管有没有@Inherit,带有注解@MyInherit的方法doSomething都可以被继承到),方法doSomething确实是被Child{}继承到了,自然方法上的注解是可以被得到的。
1 楼 forrest_lv 2011-12-19  

不错讲的鞭辟入里,我懂了

相关推荐

    Annotation详细介绍(大全)

    1. **Annotation定义**: Annotation的定义格式通常为`public @interface AnnotationName { attributes }`,其中`attributes`是Annotation的属性,可以包含零个或多个方法,这些方法代表了Annotation的参数。 2. *...

    用Annotation简化Java程序的开发(PDF)

    这里定义了一个名为`MyAnnotation`的Annotation类型,其中包含一个名为`value`的成员,其默认值为空字符串。开发者可以根据实际需求定义更多成员及其默认值。 ##### 2. 使用Annotation 在定义了Annotation之后,就...

    自定义Annotation例子

    在Java中,Annotation定义类似于接口,使用`@interface`关键字。以下是一个简单的自定义Annotation例子: ```java public @interface MyAnnotation { String value() default ""; } ``` 这里的`MyAnnotation`就是...

    Annotation(注解)详细教程,jdk新特性

    在Java中,Annotation定义为一种接口,可以通过反射API访问其信息。它们的使用非常灵活,可以应用于不同的程序元素,包括包、类、方法、字段、参数甚至局部变量。每个Annotation由一个名称和一个或多个成员组成,...

    Hibernate Annotation 学习笔记

    3. 实体类:例如,创建一个`User`类,使用Hibernate Annotation定义实体属性。`@Entity`标记表明这是一个实体类,`@Id`和`@GeneratedValue(strategy = GenerationType.AUTO)`表示`id`字段是主键,且自动生成。数据库...

    在嵌入式jetty环境下运行struts2Annotation项目

    通过创建的Jetty启动类运行项目,服务器会加载并解析Struts2 Annotation定义的Action,处理请求。 ### 7. 博文链接 提供的博文链接()可能包含更多详细的步骤和示例代码,建议参考以获取更具体的实现方法。 总结...

    02-Java注解面试题(2题)-新增.pdf

    Java 5.0 中定义了 4 种标准的元注解(meta-annotation),它们被用来提供对其他注解的说明。 1. @Target @Target meta-annotation 用于说明 Annotation 所修饰的对象范围。它可以被用于 packages、types(类、...

    JAVA_API1.6文档(中文)

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    Annotation手册

    7. **元Annotation**:元Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的生命周期(编译时、类加载时或运行时),`@Target`指定Annotation可以应用到哪些程序元素,`@Documented...

    【大厂面试题】springboot之启动原理解析及其答案

    要揭开SpringBoot的神秘面纱,我们从Annotation定义(@SpringBootApplication)和类定义 (SpringApplication.run)入手。 @SpringBootApplication public class Application { public static void main(String[] ...

    【大厂面试题】SpringBoot之启动原理非常详细解析及其答案

    要揭开SpringBoot的神秘面纱,我们从Annotation定义(@SpringBootApplication)和类定义 (SpringApplication.run)入手。 总结: SpringBoot的核心组件完成了基本的解析,综合来看,大部分都是Spring框架背后的一些...

    annotation

    #### 三、Annotation的定义与结构 - **Annotation的声明**:注解使用类似于修饰符的语法进行声明,可以应用到不同的程序元素上,如`@Override`用于方法重写标识。 - **Annotation类型**:定义注解的接口,指定了...

    Android AOP注解Annotation详解(一)

    定义属性是指 Annotation 的成员变量,Annotation 的成员变量在 Annotation 定义中以“无形参的方法”形式来声明。分类是指根据 Annotation 是否包含成员变量,可以把 Annotation 分为标记注解和元数据 Annotation。...

    自定义的Annotation

    我们可以重写`mapView(_:viewFor:)`方法来自定义视图: ```swift func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -&gt; MKAnnotationView? { guard let annotation = annotation as? Custom...

    Annotation技术

    例如,可以定义一个枚举来表示性别: ```java public enum SexEnum { MAN, FEMALE } ``` 然后在Annotation中使用这个枚举: ```java public @interface PersonInfo { SexEnum sex(); } ``` 7. **使用...

    Java Annotation注解.doc

    - **定义Annotation类型**:类似于接口声明,但使用`@`符号。每个方法定义了一个成员,方法返回类型有限制,可以是基本类型、字符串、类、枚举、注解或它们的数组,并可以有默认值。 ```java public @interface ...

    什么是Annotation?

    Annotation的定义类似于接口的定义,但前面需要加上`@interface`关键字。下面是一个简单的例子: ```java @Retention(RetentionPolicy.RUNTIME) // 指定注解的保留策略 @Target(ElementType.METHOD) // 指定...

    Hibernate Annotation 中文文档

    Hibernate Annotation是Hibernate框架的一个扩展,它允许开发者直接在Java类和属性上使用注解(Annotations),来定义实体类与数据库表之间的映射关系。相比于XML配置,注解提供了一种更加内聚和直接的方式,使得...

    compass annotation关联关系

    在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的关系更加清晰,简化了搜索引擎的集成工作。 一、Compass Annotation 概述 Compass Annotation ...

Global site tag (gtag.js) - Google Analytics