- 浏览: 157632 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
bkk854762363:
好文章,赞
Spring3.0 + 自定义注解实现操作日志记录功能 -
怪黍叔:
学习了
Spring3.0 + 自定义注解实现操作日志记录功能 -
wellway:
请问jfreechart-1.0.11-demo.jar怎么反 ...
关于JFreeChart Demo
不了解注解基础知识的请先看《JDK 5 Annotation\注解\注释\自定义注解》
子类可以继承到父类上的注解吗?
-----------------------------------------------------------------
我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。
测试环境如下:
-----------------------------------------------------------------
父类的类上和方法上有自定义的注解--MyAnnotation
子类继承了这个父类,分别:
子类方法,实现了父类上的抽象方法
子类方法,继承了父类上的方法
子类方法,覆盖了父类上的方法
MyAnnotation自定义注解
-----------------------------------------------------------------
- package test.annotation;
- import java.lang.annotation.Inherited;
- import java.lang.annotation.Retention;
- /**
- * 自定义注解
- */
- //@Inherited //可以被继承
- @Retention (java.lang.annotation.RetentionPolicy.RUNTIME) //可以通过反射读取注解
- public @interface MyAnnotation {
- String value();
- }
父类
-----------------------------------------------------------------
- package test.annotation;
- @MyAnnotation (value = "类名上的注解" )
- public abstract class ParentClass {
- @MyAnnotation (value = "父类的abstractMethod方法" )
- public abstract void abstractMethod();
- @MyAnnotation (value = "父类的doExtends方法" )
- public void doExtends() {
- System.out.println(" ParentClass doExtends ..." );
- }
- @MyAnnotation (value = "父类的doHandle方法" )
- public void doHandle(){
- System.out.println(" ParentClass doHandle ..." );
- }
- }
子类
-----------------------------------------------------------------
- package test.annotation;
- public class SubClass extends ParentClass{
- //子类实现父类的抽象方法
- @Override
- public void abstractMethod() {
- System.out.println("子类实现父类的abstractMethod抽象方法" );
- }
- //子类继承父类的doExtends方法
- //子类覆盖父类的doHandle方法
- @Override
- public void doHandle(){
- System.out.println("子类覆盖父类的doHandle方法" );
- }
- }
测试类
-----------------------------------------------------------------
- package test.annotation;
- import java.lang.reflect.Method;
- public class MainTest {
- public static void main(String[] args) throws SecurityException,
- NoSuchMethodException {
- Class<SubClass> clazz = SubClass.class ;
- if (clazz.isAnnotationPresent(MyAnnotation. class )) {
- MyAnnotation cla = clazz
- .getAnnotation(MyAnnotation.class );
- System.out.println("子类继承到父类类上Annotation,其信息如下:" +cla.value());
- } else {
- System.out.println("子类没有继承到父类类上Annotation" );
- }
- // 实现抽象方法测试
- Method method = clazz.getMethod("abstractMethod" , new Class[] {});
- if (method.isAnnotationPresent(MyAnnotation. class )) {
- MyAnnotation ma = method
- .getAnnotation(MyAnnotation.class );
- System.out.println("子类实现父类的abstractMethod抽象方法,继承到父类抽象方法中的Annotation,其信息如下:" +ma.value());
- } else {
- System.out.println("子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation" );
- }
- //覆盖测试
- Method methodOverride = clazz.getMethod("doExtends" , new Class[] {});
- if (methodOverride.isAnnotationPresent(MyAnnotation. class )) {
- MyAnnotation ma = methodOverride
- .getAnnotation(MyAnnotation.class );
- System.out
- .println("子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:" +ma.value());
- } else {
- System.out.println("子类继承父类的doExtends方法,没有继承到父类doExtends方法中的Annotation" );
- }
- //继承测试
- Method method3 = clazz.getMethod("doHandle" , new Class[] {});
- if (method3.isAnnotationPresent(MyAnnotation. class )) {
- MyAnnotation ma = method3
- .getAnnotation(MyAnnotation.class );
- System.out
- .println("子类覆盖父类的doHandle方法,继承到父类doHandle方法中的Annotation,其信息如下:" +ma.value());
- } else {
- System.out.println("子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation" );
- }
- }
- }
编写自定义注解时未写@Inherited的运行结果
-----------------------------------------------------------------
子类没有继承到父类类上Annotation
子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation
子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法
子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation
编写自定义注解时写了@Inherited的运行结果
-----------------------------------------------------------------
子类继承到父类类上Annotation,其信息如下:类名上的注解
子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation
子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法
子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation
结论
-----------------------------------------------------------------
父类的类上和方法上有自定义的注解,
子类继承了这个父类,的情况下。
编写自定义注解时未写@Inherited的运行结果: | 编写自定义注解时写了@Inherited的运行结果: | |
子类的类上能否继承到父类的类上的注解? | 否 | 能 |
子类方法,实现了父类上的抽象方法,这个方法能否继承到注解? | 否 | 否 |
子类方法,继承了父类上的方法,这个方法能否继承到注解? | 能 | 能 |
子类方法,覆盖了父类上的方法,这个方法能否继承到注解? | 否 | 否 |
我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。
通过测试结果来看,@Inherited 只是可控制 对类名上注解是否可以被继承。不能控制方法上的注解是否可以被继承。
附注
-----------------------------------------------------------------
Spring 实现事务的注解@Transactional 是可以被继承的,
通过查看它的源码可以看到@Inherited。
发表评论
-
JDK 5 Annotation\注解\注释\自定义注解
2012-11-12 17:06 1508自定义注解示例 ------ ... -
Java基础知识点梳理
2012-10-16 10:50 1159... -
String考点
2012-10-08 10:37 8791.String StringBuffer StringBui ... -
抽取网页数据的不同思路
2012-09-27 18:52 0客户要求从Internet上的网页上抽取一定的数据,用来显示或 ... -
使用TransactionTemplate 编程式控制事务
2012-09-27 17:10 27960使用 TransactionTempla ... -
Java编程中的性能优化手段
2012-09-26 15:35 10621.尽量使用final修饰符。 带有final修饰符的类是不 ... -
java 异常处理
2012-09-26 15:32 9351.异常处理的流程: ① 遇到错误,方法立即结束,并不返回一个 ... -
灵活自定义缩略图片尺寸大小方案分享(nginx,lua_nginx,GraphicsMagick)
2012-07-11 12:27 3156melin 写道 在开发电子商务网站时,同一个图片需要不 ... -
jmagic 的安装与使用
2012-03-25 08:59 1694平台:winXP 1. 安装Imag ... -
单例模式
2012-03-25 08:45 1192饿汉式: package com.design.pat ... -
判断滚动条已经滚动到底部 方法收集
2011-10-17 14:17 33051.window.onscroll=function() { ... -
Spring3.0 + 自定义注解实现操作日志记录功能
2011-06-07 18:08 6355Xml代码 <aop:aspectj-autop ... -
如何在HttpServletRequest上下文环境中判断请求是同步请求还是异步请求
2011-05-05 15:01 2018在Java后台,有时候我们需要根据同步请求和异步请求做个性 ... -
跨应用程序的session共享
2010-09-30 12:36 1887常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互 ... -
Java的垃圾回收机制详解和调优
2010-09-30 11:21 9881.JVM的gc概述 gc即 ... -
sso单点登陆学习
2010-09-30 10:43 1764我对于一个新的内容学习.一般先知道其作用和特点是什么.然后从网 ... -
单点登录系统的设计与实现方案
2010-09-30 09:26 1613目的: 对目前已有的 Web 应用系统,和将来待开发的 Web ...
相关推荐
2. 父类方法为普通方法时,子类可以重写父类方法,也可以不重写。 例如,我们可以定义一个抽象类A和一个普通类B,A中有一个抽象方法b(),B继承A并实现了b()方法。 abstract class A { public void a() {} public...
这通常是默认的继承策略,不需要在父类上声明`@Inheritance`,但可以通过`@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)`明确指定。 4. **Hibernate 具体化类(Concrete Class)** Hibernate 允许在...
- 子类继承了父类的所有非私有方法,如果子类需要修改父类的方法,可以使用`@Override`注解进行重写。 - `final`方法不能被子类重写,以防止行为被改变。 - `static`方法不会被继承,因为它们是属于类而不是实例...
这是因为子类继承了父类的所有成员变量和成员方法。子类可以通过使用 `super` 关键字来调用父类的方法。 子类重写父类的方法 在 Java 中,子类可以重写父类的方法。这是因为子类需要根据自己的需求来修改父类的...
2. **关键字表示**:在Python中,子类继承父类通常使用`class SubClass(ParentClass):`这样的语法;在Java中,使用`public class SubClass extends ParentClass {`;而在C#中,是`public class SubClass : ...
- Java遵循单一继承原则,即一个子类只能有一个直接父类,但可以间接继承多个父类(通过多层继承)。 - 多层继承的例子: ```java public class Grandparent { // ... } public class Parent extends ...
子类可以继承父类的非私有构造函数,并可以通过`super()`调用来初始化父类的部分。子类必须在自己的构造函数中显式地调用父类的构造函数,除非它自己的构造函数也使用了`this()`调用了其他构造函数。 4. 方法重写...
- **@Inherited**:这个元注解使得子类可以继承父类中的注解。只有当注解声明为`@Inherited`时,子类才能自动获取父类的注解。但请注意,这仅适用于类的继承,不适用于接口或方法的继承。 2. **注解的本质与作用**...
如果子类需要修改父类的方法实现,可以使用`@Override`注解来标记重写的方法。这有助于在编译时检查方法是否真正重写了父类的方法。 6. **抽象类和接口** - **抽象类**:包含抽象方法(没有方法体的方法)的类。...
子类继承了父类的状态(成员变量)和行为(方法),并且可以添加自己的特有属性和方法。在Java中,使用`extends`关键字来表示类之间的继承关系。例如,如果我们有一个`GeometricObject`类,它可以作为`Circle`, `...
这种设计模式有助于代码重用,使得子类可以继承父类的属性和方法,并且可以添加新的功能或覆盖已有的行为。本实例将通过`Tryextend.java`文件展示如何在Java中实现继承。 首先,让我们理解继承的基本语法。在Java中...
- **父类(超类)/子类**:在继承关系中,被继承的类称为父类或超类,而继承父类特性的新类则称为子类。 - **状态和行为的继承**:子类会继承父类的所有非私有成员变量(状态)和方法(行为)。这包括父类中的公共...
- `@Inherited`:指示子类是否可以继承父类的注解。 - `@Repeatable`:允许相同的注解在同一个程序元素上重复出现。 四、注解的处理 4.1 反射 通过Java反射API,可以在运行时检查类、接口、字段和方法上的注解,并...
如果一个注解没有声明`@Inherited`,则子类不会自动继承父类的注解。 4. **@Documented**:此元注解表示被注解的注解应该包含在生成的Javadoc文档中,提供额外的文档信息。 在Android开发中,自定义注解是非常常见...
继承的好处是把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码的冗余,以此提高代码的可读性。 继承的特点包括: 1. 成员变量的访问特点:就近原则,先在局部位置找,然后在本类成员位置找,最后...
例如,`@Target`定义了注解可以应用在哪些程序元素上,`@Retention`定义注解的保留策略,`@Documented`指示是否将注解包含在Javadoc中,`@Inherited`表示子类是否可以继承父类的注解。 3. **自定义注解(Custom ...
Java 继承是面向对象编程中的一个核心概念,它允许一个类(子类或派生类)从另一个类(父类或基类)继承特性,从而实现代码的复用和扩展。方法重写则是继承机制中一个关键的特性,允许子类对父类的方法进行定制化,...
* 继承的实现方式是使用extends关键字继承父类,并使用super关键字访问父类的成员变量和方法。 * 继承的注意点是继承的类应该具备is-a关系,继承的类应该具有共同的特征和行为,继承的类应该避免多继承。
4. **@Inherited** - 这个元注解允许子类继承父类的注解。如果一个类被@Inherited修饰的注解标注,那么它的所有子类都会默认具有这个注解,除非子类显式地再次标注。这在设计框架或库时非常有用,因为可以确保特定的...
- 当子类需要修改或扩展父类的方法时,可以使用`@Override`注解进行方法覆盖。 - 覆盖的方法必须与被覆盖的方法有相同的返回类型、方法名和参数列表。 - 子类方法的访问权限不能低于父类方法的访问权限。 **抽象类...