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

有关Annotation的继承

阅读更多

有关Annotation的继承说明:

1、JDK文档中的说明是:只有在类上应用的Annotation才能被继承,而实际应用时的结果是:除了类上应用的Annotation能被继承外,没有被重写的方法的Annotation也能被继承。

2、要注意的是:当方法被重写后,Annotation将不会被继承。

3、要使得Annotation 被继承,需要在Annotation中加标识@Inherited,并且如果要被反射应用的话,就需要还有个@Retention(RetentionPolicy.RUNTIME) 标识

4、Annotation的继承不能应用在接口上

代码一、实现类上的继承

java 代码
  1. package com.test;   
  2.   
  3. import java.lang.annotation.Inherited;   
  4. import java.lang.annotation.Retention;   
  5. import java.lang.annotation.RetentionPolicy;   
  6.   
  7. @Inherited  
  8. @Retention(RetentionPolicy.RUNTIME)   
  9. public @interface InheritedTest {   
  10.     String hello();   
  11. }   

 

java 代码
  1. package com.test;   
  2.   
  3. @InheritedTest(hello = "yahaitt")   
  4. public class InheritedParent {   
  5.   
  6. }   

 

java 代码
  1. package com.test;   
  2.   
  3. public class InheritedChild extends InheritedParent {   
  4.   
  5. }   

 

java 代码
  1. package com.test;   
  2.   
  3. public class InheritedClassTest {   
  4.   
  5.     public static void main(String[] args) throws Exception   
  6.     {   
  7.         Class<inheritedchild></inheritedchild> c = InheritedChild.class;   
  8.         if(c.isAnnotationPresent(InheritedTest.class))   
  9.         {   
  10.             InheritedTest it = c.getAnnotation(InheritedTest.class);   
  11.             System.out.println(it.hello());//yahaitt   
  12.         }   
  13.     }   
  14. }   

 

代码二、实现方法上的继承

java 代码
  1. package com.test;   
  2.   
  3. import java.lang.annotation.Inherited;   
  4. import java.lang.annotation.Retention;   
  5. import java.lang.annotation.RetentionPolicy;   
  6.   
  7. @Inherited  
  8. @Retention(RetentionPolicy.RUNTIME)   
  9. public @interface InheritedTest {   
  10.     String hello();   
  11. }   

 

java 代码
  1. package com.test;   
  2.   
  3.   
  4. public class InheritedParent {   
  5.   
  6.     @InheritedTest(hello = "yahaitt")   
  7.     public void doSomething()   
  8.     {   
  9.         System.out.println("parent do something");   
  10.     }   
  11.        
  12. }   

 

java 代码
  1. package com.test;   
  2.   
  3. public class InheritedChild extends InheritedParent {   
  4.        
  5.        
  6. }   

 

java 代码
  1. package com.test;   
  2.   
  3. import java.lang.reflect.Method;   
  4.   
  5. public class InheritedClassTest {   
  6.   
  7.     public static void main(String[] args) throws Exception   
  8.     {   
  9.         Class<inheritedchild></inheritedchild> c = InheritedChild.class;   
  10.         Method method = c.getMethod("doSomething"new Class[]{});   
  11.         if(method.isAnnotationPresent(InheritedTest.class))   
  12.         {   
  13.             InheritedTest it = method.getAnnotation(InheritedTest.class);   
  14.             System.out.println(it.hello());//yahaitt   
  15.         }   
  16.     }   
  17. }   
分享到:
评论
3 楼 jerrycong 2011-09-02  
@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 <tx:annotation-driven/>元素的出现 开启 了事务行为。

Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

注意

当使用 @Transactional 风格的进行声明式事务定义时,你可以通过 <tx:annotation-driven/> 元素的 "proxy-target-class" 属性值来控制是基于接口的还是基于类的代理被创建。如果 "proxy-target-class" 属值被设置为 "true",那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 属值被设置为 "false" 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
2 楼 szhnet 2008-05-30  
应该是先判断类上有无@Transactional,然后再判断类所继承的接口有无@Transactional
1 楼 fortaotao 2008-04-14  
接口上自定义的annotation确实无法在实现类中被继承。但是,为什么spring的@Transactional就可以呢。我看了它的源码,也没什么特殊之处,不知道您对这个有什么看法的呢。很奇怪的问题。
我现在都是在接口类上定义@Transactional,实现类就没定义这个了,但是事务是被继承下去了。难道是Spring自己做了额外的判断和处理?

相关推荐

    Hibernate继承映射(annotation)

    **标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和...

    Annotation技术

    Annotation并不直接改变程序的运行逻辑,而是通过相关的处理机制间接影响程序行为。 5. **Annotation与Javadoc** Annotation与Javadoc Tag相似,但有所不同。如果一个标记对Java文档有影响或者用于生成Java文档,...

    Annotation--学习:限定使用、文档、继承

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的能力,这些信息可以被编译器或运行时环境用来验证、处理或增强代码的行为。本篇我们将深入探讨“限定使用、文档、继承”这三个关键...

    Java Annotation注解.doc

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但可以被编译器或运行时环境用来执行特定的操作,如代码分析、...

    Annotation注解的介绍和使用

    ### Annotation注解的深入解析与应用 #### 一、Annotation概览 ##### 1.1 何为元数据 元数据,在计算机科学中,是指用于描述数据的数据,它提供了关于数据本身的附加信息,有助于理解、解释和管理数据。在编程...

    hibernate annotation 中文文档

    《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...

    Java 5 annotation 学习笔记

    Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...

    struts annotation Hello World

    此外,Struts 2还提供了其他注解,例如`@Namespace`用于定义Action的命名空间,`@ParentPackage`用于继承现有的配置包,`@SkipValidation`用于跳过特定Action的方法验证等。 为了运行这个"Hello World"应用,你需要...

    hibernate annotation api chm文件

    - `@Table`: 指定实体对应的数据库表名,以及表的相关属性如schema和catalog。 - `@Id`: 定义实体的主键字段,通常与`@GeneratedValue`结合使用,以指定主键生成策略。 - `@GeneratedValue`: 控制主键值的自动...

    struts2 使用Annotation 配置的小例子

    4. `@ParentPackage`: 这个Annotation用于指定当前Action继承自哪个默认的Struts包,这样可以复用其中的配置。 5. `@InterceptorRef`: 用于引入拦截器,拦截器是Struts2处理请求的重要部分,它们可以进行日志记录、...

    hibernate-Annotation.jar

    - `@Inheritance`:继承关系映射,可以设置单表继承或多表继承策略。 - `@SequenceGenerator`:定义序列生成器,适用于数据库不支持自增主键的情况。 **Hibernate 4.x及更高版本的变化** 从Hibernate 4.x开始,...

    annotation

    在Android开发中,`Annotation(注解)`是一种强大的工具,可以用来元数据化代码,提供编译时或运行时的附加信息。AndroidAnnotations(简称AA)是一个流行的库,它利用注解简化了Android开发,提高了代码的可读性...

    Java Annotation的讲解和例子

    4. `@Inherited`:使子类继承父类的注解。 七、实例分析 下面是一个简单的注解和处理器示例,用于检查类是否有特定注解: ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @...

    Annotation属性值

    Annotation 属性值 ...需要注意的是,Annotation 不可以继承其他接口,也不能使用除基本类型、枚举类型、Class 类型的一维数组之外的类型作为 Annotation 的类型。Annotation 也存在包结构,在使用时可以直接导入。

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    Hibernate distribution and annotation

    标题“Hibernate distribution and annotation”涉及到的是Hibernate ORM框架的一个特定版本及其相关的注解功能。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程模型来操作...

Global site tag (gtag.js) - Google Analytics