成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中的注解可以繼承嗎?

開發 前端
@Inherited?只能實現類上的注解繼承。要想實現方法上注解的繼承,你可以通過反射在繼承鏈上找到方法上的注解。是不是聽起來很麻煩,好在Spring框架中提供了AnnotatedElementUtils類,來方便我們處理注解的繼承問題。

前言

注解想必大家都用過,也叫元數據,是一種代碼級別的注釋,可以對類或者方法等元素做標記說明,比如Spring框架中的@Service,@Component等。那么今天我想問大家的是類被繼承了,注解能否繼承呢?可能會和大家想的不一樣,感興趣的可以往下看。

簡單注解繼承演示

我們不妨來驗證下注解的繼承。

自定義一個注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {

String value();
}

注解可以被標記在類或者方法上

使用自定義注解

@TestAnnotation(value = "Class")
static class Parent {

@TestAnnotation(value = "Method")
public void method() {

}
}

static class Child extends Parent {

@Override
public void method() {

}

}
  • Parent類和里面的方法使用了注解
  • Child類繼承了Parent類, 重寫了父類的方法

驗證是否存在注解

public static void main(String[] args) throws NoSuchMethodException {

Parent parent = new Parent();
log.info("ParentClass: {}", getAnnoValue(parent.getClass().getAnnotation(TestAnnotation.class)));
log.info("ParentMethod: {}", getAnnoValue(parent.getClass().getMethod("method").getAnnotation(TestAnnotation.class)));

Child child = new Child();
log.info("ChildClass: {}", getAnnoValue(child.getClass().getAnnotation(TestAnnotation.class)));
log.info("ChildMethod: {}", getAnnoValue(child.getClass().getMethod("method").getAnnotation(TestAnnotation.class)));

}

private static String getAnnoValue(TestAnnotation annotation) {
if(annotation == null) {
return "未找到注解";
}

return annotation.value();
}

輸出結果如下:

圖片

可以看到,父類的類和方法上的注解都可以正確獲得,但是子類的類和方法卻不能。這說明,默認情況下,子類以及子類的方法,無法自動繼承父類和父類方法上的注解。

使用@Inherited演示

查了網上資料以后,在注解上標記@Inherited元注解可以實現注解的繼承。那么,把@TestAnnotation注解標記了@Inherited,就可以一鍵解決問題了嗎?

圖片

重新運行,得到結果如下:

圖片

可以看到,子類可以獲得父類類上的注解;子類方法雖然是重寫父類方法,并且注解本身也支持繼承,但還是無法獲得方法上的注解。

如何重寫方法繼承注解?

實際上,@Inherited只能實現類上的注解繼承。要想實現方法上注解的繼承,你可以通過反射在繼承鏈上找到方法上的注解。是不是聽起來很麻煩,好在Spring框架中提供了AnnotatedElementUtils類,來方便我們處理注解的繼承問題。

調用AnnotatedElementUtils的findMergedAnnotation()方法,可以幫助我們找出父類和接口、父類方法和接口方法上的注解,實現一鍵找到繼承鏈的注解:

圖片

輸出結果如下圖:

圖片

總結

自定義注解可以通過標記元注解@Inherited實現注解的繼承,不過這只適用于類。如果要繼承定義在接口或方法上的注解,可以使用Spring的工具類AnnotatedElementUtils。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2023-05-09 12:42:51

Java繼承多態

2022-05-05 10:40:36

Spring權限對象

2011-07-15 15:47:02

JAVA

2012-02-09 10:42:24

Java

2017-11-17 09:13:31

Java注解

2022-09-26 07:32:24

開發接口編程

2023-06-30 08:26:24

Java注解Java程序元素

2022-03-21 15:11:17

Java繼承初始化

2023-01-30 07:58:30

繼承代碼復用

2023-11-07 07:39:56

Java集合數據結構

2020-11-20 07:58:04

Java

2021-05-27 08:21:51

JS繼承對象

2021-03-08 00:11:02

Spring注解開發

2017-02-06 13:31:19

Android樣式繼承關系

2023-05-29 16:58:16

2023-07-26 00:32:33

注解抽象spring

2009-06-17 13:26:06

scala繼承模型

2021-12-30 12:30:01

Java注解編譯器

2022-05-27 10:19:03

Lombok?JavaJDK14

2009-07-14 17:36:28

Jython的繼承
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美精品一区二区三区 | 亚洲综合天堂 | 成人精品免费视频 | 国产欧美一区二区三区久久 | 日韩精品在线视频 | 亚洲成人精品 | 国产一区二区免费电影 | 久草在线 | 欧美aaaaa| 日日夜夜天天 | 请别相信他免费喜剧电影在线观看 | 午夜影院在线观看 | 亚洲成人精品视频 | 作爱视频免费看 | www.日日夜夜 | 国产精品免费在线 | 一区二区在线 | 国产乱码精品一区二区三区五月婷 | 久久a久久| 人人擦人人 | 精品国产一区二区三区久久久久久 | 国产成人精品一区二区三区网站观看 | 国内精品伊人久久久久网站 | 91影院在线观看 | 精品国产精品 | 亚洲国产精品久久久 | 综合二区| 成人国产一区二区三区精品麻豆 | 国产98色在线 | 日韩 | 91九色网站 | 久久欧美高清二区三区 | 五月免费视频 | 日本韩国欧美在线观看 | 欧美一区免费 | 国产精品一区二区三 | 黄色毛片免费看 | 欧美精品久久 | 黄色免费av | 日韩有码一区二区三区 | 国产精品久久久久久久久久久久久 | 日韩精品在线看 |