子类可以继承到父类上的注解吗--有结论了
来源:互联网 发布:福建文化特色 知乎 编辑:程序博客网 时间:2024/05/16 00:48
博客:http://elf8848.iteye.com
不了解注解基础知识的请先看《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。
另一篇 :
1、声明
以下是java.lang.Package.isAnnotationPresent()方法的声明
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
2、参数
annotationClass -- 对应于注释类型的Class对象
3、返回值
如果一个注解指定注释类型是存在于此元素上此方法返回true,否则返回false
4、异常
NullPointerException -- 如果给定的注释类为null
5、例子
下面的例子显示lang.Object.isAnnotationPresent()方法的使用:
package com.yiibai;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
// declare a new annotation
@Retention(RetentionPolicy.RUNTIME)
@interface Demo {
String str();
int val();
}
public class PackageDemo {
// set values for the annotation
@Demo(str =
"Demo Annotation"
, val = 100)
// a method to call in the main
public static void example() {
PackageDemo ob =
new
PackageDemo();
try
{
Class c = ob.getClass();
// get the method example
Method m = c.getMethod(
"example"
);
// get the annotation for class Demo
Demo annotation = m.getAnnotation(Demo.class);
// print the annotation
System.out.println(annotation.str() +
" "
+ annotation.val());
}
catch
(NoSuchMethodException exc) {
exc.printStackTrace();
}
}
public static void main(String args[]) {
example();
Package[] pack = Package.getPackages();
// check if annotation hello exists
for
(int i = 0; i < pack.length; i++) {
System.out.println(
""
+ pack[i].isAnnotationPresent(Demo.class));
}
}
}
编译和运行上面的程序,这将产生以下结果:
Demo Annotation 100
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
- 子类可以继承到父类上的注解吗--有结论了
- 子类可以继承到父类上的注解吗--有结论了
- 子类可以继承到父类上的注解吗--有结论了
- 子类可以继承到父类上的注解吗--有结论了
- 子类可以继承到父类上的注解吗--有结论了
- 子类可以继承到父类上的注解吗--有结论了
- 子类是否可以继承父类的注解
- 03-子类可以继承父类的什么?
- JAVA中子类继承了父类的私有属性方法了吗?
- java 子类可以继承父类中的什么,子类中方法覆盖,final关键字的含义
- 继承的概念:继承是指类与类之间的继承关系 ,子类继承父类,子类可以将父类的属性方法继承下来 网址:www.iphonetrain.com 以下代码是了车类与出租车类 共同继承了Car属性
- Java中子类继承了父类的私有属性及方法吗?
- java中子类继承了父类的哪些成员
- JAVA中子类是否可以可以继承、重写父类的静态方法--总结
- 子类的继承
- 子类的继承性
- 【Java笔记】继承父类的方法可以调用子类的方法(子类必须在重写相应方法)
- CSDN的Blog有可以使用了!
- 每日一Linux命令(1):mkdir
- JavaScript中getBoundingClientRect()方法详解
- SQL——回头看,原来“事务”在这里!!!
- Http协议格式
- AndroidStudio 使用Gradle 控制Log 日志输出
- 子类可以继承到父类上的注解吗--有结论了
- How to decompile jar file?
- 大数据系列修炼-Scala课程53
- Tea (思维)
- epoll实现细节——源码解析
- html5音频和视频
- 算法-第四版-练习1.2.17解答
- Swift 3 Access Levels 访问权限的学习
- Android开发技术网站推荐