大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 創建Java自定義注解

創建Java自定義注解

更新時間:2022-07-01 11:05:54 來源:動力節點 瀏覽2609次

如何創建Java自定義注解?動力節點小編來為大家解答。Java 中的注釋是一種將元數據信息添加到我們的源代碼的機制。它們是 JDK5 中添加的 Java 的一個強大部分。注釋提供了使用 XML 描述符和標記接口的替代方法。

雖然我們可以將它們附加到包、類、接口、方法和字段上,但注釋本身對程序的執行沒有影響。

在本教程中,我們將重點介紹如何創建和處理自定義注釋。我們可以在關于注釋基礎的文章中閱讀更多關于注釋的信息。

創建自定義注釋

我們將創建三個自定義注釋,目標是將對象序列化為 JSON 字符串。

我們將在類級別使用第一個,向編譯器指示我們的對象可以被序列化。然后我們將第二個應用到我們想要包含在 JSON 字符串中的字段。

1.類級別注釋示例

創建自定義注解的第一步是使用@interface關鍵字聲明它:

public @interface JsonSerializable {
}

下一步是添加元注釋來指定我們自定義注釋的范圍和目標:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.Type)
public @interface JsonSerializable {
}

如我們所見,我們的第一個注解具有運行時可見性,我們可以將其應用于類型(類)。此外,它沒有方法,因此可以作為一個簡單的標記來標記可以序列化為 JSON 的類。

(2)字段級注釋示例

以同樣的方式,我們創建第二個注釋來標記我們將包含在生成的 JSON 中的字段:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JsonElement {
    public String key() default "";
}

注釋聲明了一個名為“key”的字符串參數和一個空字符串作為默認值。

在使用方法創建自定義注解時,我們應該注意這些方法必須沒有參數,并且不能拋出異常。此外,返回類型僅限于這些類型的基元、字符串、類、枚舉、注釋和數組, 默認值不能為 null。

(3)方法級別注釋示例

假設在將對象序列化為 JSON 字符串之前,我們想要執行一些方法來初始化對象。出于這個原因,我們將創建一個注釋來標記這個方法:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Init {
}

我們聲明了一個具有運行時可見性的公共注釋,我們可以將其應用于類的方法。

(4)應用注釋

現在讓我們看看如何使用我們的自定義注解。例如,假設我們有一個Person類型的對象 ,我們想將其序列化為 JSON 字符串。這種類型有一個方法可以將名字和姓氏的第一個字母大寫。我們需要在序列化對象之前調用這個方法:

@JsonSerializable
public class Person {
    @JsonElement
    private String firstName;
    @JsonElement
    private String lastName;
    @JsonElement(key = "personAge")
    private String age;
    private String address;
    @Init
    private void initNames() {
        this.firstName = this.firstName.substring(0, 1).toUpperCase() 
          + this.firstName.substring(1);
        this.lastName = this.lastName.substring(0, 1).toUpperCase() 
          + this.lastName.substring(1);
    }
    // Standard getters and setters
}

通過使用我們的自定義注釋,我們表明我們可以將 Person 對象序列化為 JSON 字符串。此外,輸出應僅包含該對象的firstName、lastName和age字段。此外,我們希望在序列化之前調用initNames()方法。

通過將@JsonElement注釋的關鍵參數設置為“personAge”,我們表明我們將使用此名稱作為JSON 輸出中字段的標識符。

為了演示,我們將initNames() 設為私有,因此我們不能通過手動調用來初始化我們的對象,而且我們的構造函數也沒有使用它。

處理注釋

到目前為止,我們已經了解了如何創建自定義注釋,以及如何使用它們來裝飾Person類。現在我們將了解如何通過使用 Java 的反射 API 來利用它們。

第一步是檢查我們的對象是否為空,以及它的類型是否有 @JsonSerializable注解:

private void checkIfSerializable(Object object) {
    if (Objects.isNull(object)) {
        throw new JsonSerializationException("The object to serialize is null");
    }        
    Class<?> clazz = object.getClass();
    if (!clazz.isAnnotationPresent(JsonSerializable.class)) {
        throw new JsonSerializationException("The class " 
          + clazz.getSimpleName() 
          + " is not annotated with JsonSerializable");
    }
}

然后我們尋找任何帶有@Init 注解的方法,并執行它來初始化我們對象的字段:

private void initializeObject(Object object) throws Exception {
    Class<?> clazz = object.getClass();
    for (Method method : clazz.getDeclaredMethods()) {
        if (method.isAnnotationPresent(Init.class)) {
            method.setAccessible(true);
            method.invoke(object);
        }
    }
 }

方法的調用 。setAccessible ( true)允許我們執行私有的initNames()方法。

初始化后,我們遍歷對象的字段,檢索 JSON 元素的鍵和值,并將它們放入映射中。然后我們從地圖創建 JSON 字符串:

private String getJsonString(Object object) throws Exception {	
    Class<?> clazz = object.getClass();
    Map<String, String> jsonElementsMap = new HashMap<>();
    for (Field field : clazz.getDeclaredFields()) {
        field.setAccessible(true);
        if (field.isAnnotationPresent(JsonElement.class)) {
            jsonElementsMap.put(getKey(field), (String) field.get(object));
        }
    }		     
    String jsonString = jsonElementsMap.entrySet()
        .stream()
        .map(entry -> "\"" + entry.getKey() + "\":\"" 
          + entry.getValue() + "\"")
        .collect(Collectors.joining(","));
    return "{" + jsonString + "}";
}

同樣,我們使用了 field。setAccessible ( true )因為Person對象的字段是私有的。

我們的 JSON 序列化程序類結合了上述所有步驟:

public class ObjectToJsonConverter {
    public String convertToJson(Object object) throws JsonSerializationException {
        try {
            checkIfSerializable(object);
            initializeObject(object);
            return getJsonString(object);
        } catch (Exception e) {
            throw new JsonSerializationException(e.getMessage());
        }
    }
}

最后,我們運行一個單元測試來驗證我們的對象是否按照自定義注釋的定義進行了序列化:

@Test
public void givenObjectSerializedThenTrueReturned() throws JsonSerializationException {
    Person person = new Person("soufiane", "cheouati", "34");
    ObjectToJsonConverter serializer = new ObjectToJsonConverter(); 
    String jsonString = serializer.convertToJson(person);
    assertEquals(
      "{\"personAge\":\"34\",\"firstName\":\"Soufiane\",\"lastName\":\"Cheouati\"}",
      jsonString);
}

以上就是關于“創建Java自定義注解”的介紹,大家如果對此比較感興趣,想了解更多相關知識,不妨來關注一下動力節點的Java開發自定義注解,里面有更詳細的介紹,希望對大家能夠有所幫助哦。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲精品久久久久网站 | 日韩欧美一中字暮 | 久草在线视频看看 | 久草新视频 | 午夜精品久久久久久久第一页 | 精品成人一区二区三区免费视频 | 久久久小视频 | 中文字幕在线亚洲精品 | 99视频国产精品 | 久操免费 | 国产成人亚洲精品91专区手机 | 色九九| 成人欧美精品一区二区不卡 | 欧美日韩a级片 | 国产专区日韩精品欧美色 | 在线观看自拍视频 | 一级片在线观看免费 | 全免费a级毛片免费看视频免 | 色婷婷色综合 | 国产精品久久久久久一区二区三区 | 99视频九九精品视频在线观看 | jizzjizz中国丝袜美女 | 色久综合网 | 日本韩国欧美在线观看 | www.狠狠插| 欧美拍拍视频 | 欧美亚洲精品一区二三 | 国产欧美精品一区aⅴ影院 国产欧美精品一区二区 | 国产欧美另类久久久精品免费 | 免费观看日本高清a毛片 | 亚州免费一级毛片 | 国产91精品久久久久久久 | www.四虎在线 | 国产精品久久新婚兰兰 | 日本欧美一二三区色视频 | 在线播放国产精品 | 欧美曰韩一区二区三区 | 91精品国产人成网站 | 久久嫩草影院免费看夜色 | 亚洲成人在线免费观看 | 2022国产男人亚洲欧美天堂 |