国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java基礎教程】(二十六)Java新特性篇 · 第六講:注解——解碼程序設計中的元數(shù)據(jù)利器,用小小的@符里做大大的開發(fā)~

這篇具有很好參考價值的文章主要介紹了【Java基礎教程】(二十六)Java新特性篇 · 第六講:注解——解碼程序設計中的元數(shù)據(jù)利器,用小小的@符里做大大的開發(fā)~。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Java基礎教程】(二十六)Java新特性篇 · 第六講:注解——解碼程序設計中的元數(shù)據(jù)利器,用小小的@符里做大大的開發(fā)~,# Java基礎教程,java,spring,開發(fā)語言,java-ee,經(jīng)驗分享,jvm

1?? 概念

Java 注解(Annotation) 是Java語言中一種元數(shù)據(jù)形式,它提供了一種在代碼中添加元數(shù)據(jù)的方式。注解為程序員提供了向代碼中添加額外信息的能力,這些額外信息可以被編譯器、工具或者運行時環(huán)境使用。

2?? 優(yōu)勢和缺點

優(yōu)點:

  • 提供了一種更加簡潔和可讀性強 的代碼編寫風格;
  • 增強代碼的可維護性和可重用性,通過使用注解可以減少重復的代碼;
  • 可以幫助開發(fā)者在編譯時檢測錯誤,提高代碼的健壯性。

缺點:

  • 過度使用注解會使代碼變得復雜和難以理解;
  • 注解的濫用可能導致代碼過于依賴于特定的框架或工具,降低了代碼的可移植性;
  • 注解可能增加代碼的復雜性,并且可能需要花費更多的時間來學習和理解其使用方式。

3?? 使用

3.1 元注解

元注解也是一種注解,用于對其他注解進行注釋。Java提供了幾種元注解,用于自定義和修飾注解聲明,包括以下幾種:

  • @Retention:指定注解的生命周期,可選值包括SOURCE、CLASSRUNTIME;
  • @Target:指定注解可以應用的目標元素類型,如類、方法、字段等;
  • @Documented:指定注解是否包含在API文檔中;
  • @Inherited:指定子類是否繼承父類的注解;
  • @Repeatable:指定該注解可以被多次應用于同一元素。

3.2 自定義注解

在Java中,我們可以自定義注解,以滿足特定的需求。自定義注解使用@interface關鍵字進行聲明。

下面是一個使用上文元注解的簡單演示案例程序,展示了如何在Java中應用這些注解來自定義一個注解:

import java.lang.annotation.*;

// 定義一個自定義注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
@Repeatable(MyAnnotations.class)
@interface MyAnnotation {
    String value() default "";
}

// 定義一個可重復注解容器
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotations {
    MyAnnotation[] value();
}

// 使用自定義注解
@MyAnnotation("Class Annotation")
public class DemoClass {

    @MyAnnotation("Field Annotation")
    private String field;

    @MyAnnotation("Constructor Annotation")
    public DemoClass() {
        // 構造函數(shù)注解
    }

    @MyAnnotation("Method Annotation")
    public void demoMethod() {
        // 方法注解
    }

    public static void main(String[] args) {
        DemoClass obj = new DemoClass();
        Class<? extends DemoClass> clz = obj.getClass();

        // 獲取類上的注解
        MyAnnotation classAnnotation = clz.getAnnotation(MyAnnotation.class);
        System.out.println("Class Annotation: " + classAnnotation.value());

        // 獲取字段上的注解
        try {
            java.lang.reflect.Field field = clz.getDeclaredField("field");
            MyAnnotation fieldAnnotation = field.getAnnotation(MyAnnotation.class);
            System.out.println("Field Annotation: " + fieldAnnotation.value());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        // 獲取構造函數(shù)上的注解
        try {
            java.lang.reflect.Constructor<?> constructor = clz.getDeclaredConstructor();
            MyAnnotation constructorAnnotation = constructor.getAnnotation(MyAnnotation.class);
            System.out.println("Constructor Annotation: " + constructorAnnotation.value());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        // 獲取方法上的注解
        try {
            java.lang.reflect.Method method = clz.getDeclaredMethod("demoMethod");
            MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
            System.out.println("Method Annotation: " + methodAnnotation.value());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

這段代碼演示了如何定義和使用自定義注解,并從類、字段、構造函數(shù)和方法中獲取注解的值。

首先,我定義了一個自定義注解 @MyAnnotation。注解的定義可以通過多個元注解修飾,這些元注解用于為注解提供額外的信息:

  • @Retention(RetentionPolicy.RUNTIME):指定注解保留的生命周期為運行時。這意味著注解將在運行時仍然可見,可以通過 Java 反射機制獲取;
  • @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR}):指定注解可以應用于類、字段、方法和構造函數(shù)上;
  • @Documented:指定該注解將包含在 Javadoc 中;
  • @Inherited:指定子類默認繼承父類的注解。

之后,在 DemoClass 類上、類中的字段、構造函數(shù)和方法上都使用了自定義注解 @MyAnnotation。

main 方法中,首先創(chuàng)建了一個 DemoClass 對象 obj,通過反射獲取 DemoClass 類的實例對象的運行時類型以及類上的注解。

接著,通過反射機制分別獲取字段上的注解、構造函數(shù)上的注解、方法上的注解。并且打印了相應注解的值,以演示如何從類、字段、構造函數(shù)和方法中獲取注解的值。

通過自定義注解,我們可以根據(jù)需要添加元數(shù)據(jù),并在代碼中使用它。

3.3 常用內置注解

Java提供了很多內置的注解,我們來介紹幾個常用的注解:

  • @Override:用于標記方法覆寫(重寫)父類的方法,可以幫助我們檢查是否正確地覆寫了方法;
  • @Deprecated:用于標記過時的方法或類,在程序中使用過時的元素會收到警告提示,鼓勵使用更合適的替代方案;
  • @SuppressWarnings:用于抑制編譯器產生的警告信息,可以讓代碼看起來更整潔,但需謹慎使用;
  • @FunctionalInterface:用于標記函數(shù)式接口(只有一個抽象方法),可以確保接口的語義符合函數(shù)式編程的要求。

下面是一個使用Java實現(xiàn)的演示案例程序,展示了如何使用@Override、@Deprecated、@SuppressWarnings@FunctionalInterface注解:

import java.util.ArrayList;
import java.util.List;

class Parent {
    public void display() {
        System.out.println("Parent class");
    }
}

class Child extends Parent {
    @Override
    public void display() {
        System.out.println("Child class");
    }
}

@Deprecated
class DeprecatedClass {
    @Deprecated
    public void deprecatedMethod() {
        System.out.println("\nThis method is deprecated.");
    }
}

@SuppressWarnings("unused")
class SuppressWarningsClass {
    // unused field
    private int unusedVariable;

    @SuppressWarnings("unchecked")
    public void suppressWarningsMethod() {
        List list = new ArrayList();
        list.add("item");
        System.out.println("\n" + list);
    }
}

@FunctionalInterface
interface FunctionalInterfaceExample {
    void someMethod();
}

public class AnnotationDemo {
    public static void main(String[] args) {
        // @Override example
        Parent parent = new Parent();
        Child child = new Child();

        parent.display();           // Output: Parent class
        child.display();            // Output: Child class

        // @Deprecated example
        DeprecatedClass  deprecatedObject = new DeprecatedClass();
        deprecatedObject.deprecatedMethod();  // Output: This method is deprecated.

        // @SuppressWarnings example
        SuppressWarningsClass suppressWarningsObject = new SuppressWarningsClass();
        suppressWarningsObject.suppressWarningsMethod();  // No warning will be generated

        // @FunctionalInterface example
        FunctionalInterfaceExample functionalInterfaceObject = () -> System.out.println("\nFunctional Interface");
        functionalInterfaceObject.someMethod();  // Output: Functional Interface
    }
}

在這個示例程序中,我們創(chuàng)建了Parent類和Child類,其中Child類使用@Override注解來標記覆寫(重寫)了Parent類中的display()方法。這樣在編譯時,如果有錯誤地覆寫了父類的方法,編譯器將會給出錯誤提示。

另外,我們還創(chuàng)建了一個名為DeprecatedClass的過時類,并在其中的方法和類聲明上都使用了@Deprecated注解。當我們在程序中使用過時的方法或類時,編譯器會發(fā)出警告,鼓勵我們使用更合適的替代方案。

同樣,我們還創(chuàng)建了一個名為SuppressWarningsClass的類,在該類的方法和字段上使用了@SuppressWarnings注解來抑制編譯器產生的警告信息,以便讓代碼看起來更整潔。但是需要注意,謹慎使用此注解,確保其使用場景合理。

再者,我們創(chuàng)建了一個函數(shù)式接口FunctionalInterfaceExample,并使用@FunctionalInterface注解進行標記。這個注解可以確保該接口只有一個抽象方法,從而符合函數(shù)式編程的要求。

最后,在main方法中展示了如何使用這些注解的例子,運行程序驗證結果如下:

Parent class
Child class

This method is deprecated.

[item]

Functional Interface

4?? 應用場景

Java注解廣泛應用于各個領域,包括但不限于以下幾個方面:

  • 標記/標識:注解可以用于對類、方法、字段等進行標記,以便將來在編譯期、運行時或工具處理期間根據(jù)標記進行特定操作;
  • 配置/設置:注解可以用于配置代碼,在運行時根據(jù)注解的參數(shù)動態(tài)地控制程序的行為;
  • 生成代碼/文檔:通過使用注解,可以自動生成代碼、配置文件或文檔等。

5?? 底層原理

Java注解的底層原理主要涉及兩個關鍵部分:反射(Reflection)和代理模式(Proxy)。下面逐步介紹這兩個概念,以及它們與Java注解的關系。

  1. 反射(Reflection)
    反射是Java語言的一種特性,允許程序在運行時檢查和修改自身的行為。通過反射,我們可以動態(tài)獲取類的信息、調用方法和訪問字段等。所以在使用注解時,需要使用反射來解析注解并執(zhí)行相應的操作。

  2. 代理模式(Proxy)
    代理模式允許一個對象(代理對象)控制另一個對象(目標對象)的訪問。在使用注解時,通常會有一個注解處理器(Annotation Processor)作為代理對象,負責在編譯期或運行時掃描代碼中的注解,并進行相應的處理。

Java注解的底層原理如下:

  • 在編譯期:當我們在源代碼中添加注解時,編譯器會首先讀取并解析這些注解。然后,在編譯過程中,注解處理器會根據(jù)注解的類型執(zhí)行相應的邏輯,并生成一些額外的代碼。
  • 在運行時:當編譯完成后,生成的字節(jié)碼文件中會包含注解的信息。在運行時,Java虛擬機(JVM)通過反射讀取這些已編譯的注解,并執(zhí)行相應的操作。注解處理器也可以在運行時掃描類路徑上的字節(jié)碼文件,獲取注解信息并進行進一步的處理。

總結來說,Java注解的底層原理主要利用了反射和代理模式。反射機制使得我們能夠動態(tài)讀取和修改注解信息,而代理模式則通過注解處理器來實現(xiàn)對注解的解析和處理。這種機制為開發(fā)人員提供了一種方便且靈活地處理元數(shù)據(jù)的方式,并且在許多框架和工具中得到了廣泛的應用。

6?? 擴展:那些流行框架中的注解

在各個流行框架中,注解都起著重要的作用。它們?yōu)殚_發(fā)者提供了一種簡潔、靈活和快速的方式來配置和擴展應用程序。

下面列舉了一些主要流行框架中注解的應用范例:

  1. Spring

    • @Component:標記類為一個可被Spring容器管理的組件;
    • @Controller:標記控制器類,用于處理用戶請求;
    • @RequestMapping:在控制器方法上定義路由規(guī)則與請求的映射關系;
    • @Service:標記服務層類,在業(yè)務邏輯中使用;
    • @Repository:標記數(shù)據(jù)訪問層類,使得 Spring 可以自動將其納入到 bean 容器;
    • @Autowired:自動將依賴注入到相應的類中,簡化了組件間的耦合關系;
    • @Configuration:標記類為Spring配置類;
    • @Bean:標記方法返回值為Spring Bean,并由容器管理。
  2. Spring Boot

    • @SpringBootApplication:標記引導類,表示一個 Spring Boot 應用程序入口點;
    • @RestController:結合了 @Controller@ResponseBody,用于構建 RESTful API 控制器;
    • @RequestMapping:指定請求的 URL 路徑和 HTTP 方法與方法的映射關系;
    • @ConfigurationProperties:綁定屬性文件或環(huán)境變量到 Java Bean,方便地進行配置管理;
    • @EnableAutoConfiguration:啟用自動配置,根據(jù)類路徑下的依賴和規(guī)則推斷、添加 Bean。
  3. Spring Cloud

    • @EnableDiscoveryClient:啟用服務發(fā)現(xiàn);
    • @EnableCircuitBreaker:啟用斷路器;
    • @FeignClient:聲明一個可調用遠程服務的客戶端接口;
    • @EnableZuulProxy:啟用Zuul代理網(wǎng)關;
    • @LoadBalanced:啟用負載均衡客戶端。
  4. Spring MVC

    • @Controller:標記類為MVC控制器;
    • @RequestMapping:將請求映射到控制器的方法上;
    • @RequestParam:將請求參數(shù)映射到方法參數(shù)上;
    • @PathVariable:將URL路徑變量映射到方法參數(shù)上;
    • @ResponseBody:將方法返回值序列化成響應主體。
  5. MyBatis

    • @Mapper:標記接口為MyBatis的映射器;
    • @Select:定義查詢語句;
    • @Insert:定義插入語句;
    • @Update:定義更新語句;
    • @Delete:定義刪除語句;
    • @Param:指定方法參數(shù)與SQL語句中的參數(shù)對應關系等。
  6. Hibernate

    • @Entity:聲明實體類;
    • @Table:指定實體類與數(shù)據(jù)庫表之間的映射關系;
    • @Column:定義屬性與數(shù)據(jù)庫列之間的映射關系;
    • @Id:標識實體類的主鍵屬性;
    • @GeneratedValue:指定主鍵生成策略;
    • @ManyToOne:定義多對一關系。
  7. Junit

    • @Test:標記測試方法;
    • @Before:在每個測試方法執(zhí)行前被執(zhí)行的方法;
    • @After:在每個測試方法執(zhí)行后被執(zhí)行的方法;
    • @RunWith:指定測試運行器,如使用 Spring 進行測試時可以指定 @RunWith(SpringRunner.class)
    • @BeforeEach:在每個測試方法之前運行的方法(JUnit 5);
    • @AfterEach:在每個測試方法之后運行的方法(JUnit 5);
    • @ParameterizedTest:參數(shù)化測試方法(JUnit 5)。

注解在這些框架中廣泛應用,通過提供特定的注解,開發(fā)者可以方便地實現(xiàn)配置、路由、依賴注入、持久化等相關功能,大大簡化了開發(fā)過程。同時,注解也為框架提供了更好的擴展性和靈活性。

?? 總結

Java注解提供了一種簡潔、靈活和強大的方式來為代碼添加額外的元數(shù)據(jù)信息。它們能夠提高代碼的可讀性、可維護性和健壯性。盡管有一些缺點,但合理地使用注解將帶來很多好處。隨著時間的推移,注解已經(jīng)成為許多流行框架和庫的核心組成部分。


? 溫習回顧上一篇(點擊跳轉)《【Java基礎教程】(二十五)Java新特性篇 · 第五講:正則表達式——概念及語法、Java操作API、使用技巧與應用場景 ~》

? 繼續(xù)閱讀下一篇(點擊跳轉)《【Java基礎教程】(二十七)Java新特性篇 · 第七講:Lambda表達式——概念及優(yōu)缺點、語法結構及各類案例、應用場景與優(yōu)化技巧~》
文章來源地址http://www.zghlxwxcb.cn/news/detail-590193.html

【Java基礎教程】(二十六)Java新特性篇 · 第六講:注解——解碼程序設計中的元數(shù)據(jù)利器,用小小的@符里做大大的開發(fā)~,# Java基礎教程,java,spring,開發(fā)語言,java-ee,經(jīng)驗分享,jvm

到了這里,關于【Java基礎教程】(二十六)Java新特性篇 · 第六講:注解——解碼程序設計中的元數(shù)據(jù)利器,用小小的@符里做大大的開發(fā)~的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • JavaScript進階(二十六):ES各版本特性詳解

    ECMAScript 是一種由Ecma國際(前身為歐洲計算機制造商協(xié)會,European Computer Manufacturers Association)通過ECMA-262標準化的腳本程序設計語言。這種語言在萬維網(wǎng)上應用廣泛,它往往被稱為 JavaScript 或 JScript ,所以它可以理解為是 JavaScript 的一個標準,但實際上后兩者是ECMA-262標準的

    2024年02月07日
    瀏覽(21)
  • MyBatis第六講:MyBatis緩存

    MyBatis 提供了一級緩存和二級緩存的支持。默認情況下,MyBatis 只開啟一級緩存。 8、1MyBatis一級緩存 一級緩存是基于MyBatis自帶的 HashMap 本地緩存,作用范圍為 SqlSession 域內。當刷新或者關閉之后,該 SqlSession 中所有的緩存就會被清空。 在參數(shù)和 SQL 完全一樣的情況下,我們使

    2024年02月11日
    瀏覽(19)
  • 【Django入門】《第六講》郵件發(fā)送

    【Django入門】《第六講》郵件發(fā)送

    ????????Django開發(fā)時,對于用戶注冊時我們需要通過郵件給用戶發(fā)送激活地址。Django有自己的郵件發(fā)送庫。我們只需要配置好對應的郵件內容就可以了。 ????????在 Django 中發(fā)送郵件需要使用內置的 django.core.mail 模塊。要發(fā)送郵件,需要配置郵件相關的設置,并且安裝

    2024年02月11日
    瀏覽(14)
  • 第六講:靜態(tài)路由的原理和配置

    第六講:靜態(tài)路由的原理和配置

    首先我們知道路由器是工作在網(wǎng)絡層的,那就是三層設備。網(wǎng)絡層的功能主要為:不同網(wǎng)段之間通信、最佳路徑選擇也就是邏輯地址(ip地址)尋址、轉發(fā)數(shù)據(jù)。 ●路由器是能將數(shù)據(jù)包轉發(fā)到正確的目的地,并且在轉發(fā)過程中選擇最佳路徑的設備,用于不同網(wǎng)絡之間的通信。

    2024年02月05日
    瀏覽(19)
  • 藍橋杯第六講--簡單dp【例題】

    藍橋杯第六講--簡單dp【例題】

    藍橋杯官網(wǎng):藍橋杯大賽——全國大學生TMT行業(yè)賽事 ?本博客講解 藍橋杯C/C++ 備賽所涉及算法知識,此博客為第六講:簡單dp【例題】 本篇博客所包含習題有: ?? 01背包問題 ?? 摘花生 ?? 最長上升子序列 簡單dp【習題】見博客:藍橋杯第六講–簡單dp【習題】 博客內容以

    2023年04月25日
    瀏覽(22)
  • Redis 7 第六講 主從模式(replica)

    Redis 7 第六講 主從模式(replica)

    ?????? ? 此篇開始進入架構篇范圍(?′艸`?) ?????????即主從復制,master以寫為主,Slave以讀為主。當master數(shù)據(jù)變化的時候,自動將新的數(shù)據(jù)異步同步到其它slave數(shù)據(jù)庫。 讀寫分離 容災備份 數(shù)據(jù)備份 水平擴容 參數(shù)名 默認值 修改值 6379 6380 6381 daemo

    2024年02月10日
    瀏覽(20)
  • Git第十六講 Git屬性和忽略文件

    在使用Git進行版本控制時,我們常常需要忽略某些文件或目錄,例如編譯產生的臨時文件、日志文件等,以避免將它們包含在版本庫中。Git屬性和忽略文件是兩種常用的機制,用于控制文件的跟蹤和忽略。本文將介紹如何使用Git屬性和忽略文件來管理項目中的文件。 Git屬性可

    2024年02月16日
    瀏覽(21)
  • 【前端知識】React 基礎鞏固(二十六)——Portals 的使用

    【前端知識】React 基礎鞏固(二十六)——Portals 的使用

    通常,組件會渲染到 root 節(jié)點下??墒褂?Portals 將組件渲染至其他節(jié)點。 添加 id 為 more、modal 的 div 元素 構建 Modal.jsx, 通過 createPortal 把組件渲染到指定的 modal 節(jié)點下 構建 App.jsx 查看渲染結果

    2024年02月16日
    瀏覽(47)
  • 《互聯(lián)網(wǎng)的世界》第六講-去中心化和安全

    《互聯(lián)網(wǎng)的世界》第六講-去中心化和安全

    互聯(lián)網(wǎng)構建于開放互聯(lián)的中立原則之上,公平接入,數(shù)據(jù)互聯(lián)互通,流量被無差別對待,這意味著互聯(lián)網(wǎng)本質上是匿名,去中心的,這與我們的現(xiàn)實世界完全不同。 但互聯(lián)網(wǎng)上的主流業(yè)務卻是 c/s 產銷模式,試圖在互聯(lián)網(wǎng)世界復刻現(xiàn)實世界。我們對比開放互聯(lián)的中立原則和現(xiàn)

    2024年03月19日
    瀏覽(23)
  • WPF入門教程系列二十六——DataGrid使用示例(3)

    WPF入門教程系列二十六——DataGrid使用示例(3)

    WPF入門教程系列目錄 WPF入門教程系列二——Application介紹 WPF入門教程系列三——Application介紹(續(xù)) WPF入門教程系列四——Dispatcher介紹 WPF入門教程系列五——Window 介紹 WPF入門教程系列十一——依賴屬性(一) WPF入門教程系列十五——WPF中的數(shù)據(jù)綁定(一) ? 五、DataGrid的DataG

    2024年02月06日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包