Java 注解與 APT(Annotation Processing Tool)

Java 注解與 APT(Annotation Processing Tool)

注解(Annotation)基礎

注解是 Java 語言的一種元數據形式,它可以在代碼中添加標記信息,用于描述代碼的額外信息,但不會直接影響代碼的執行邏輯。注解廣泛應用于框架配置、代碼分析、編譯時檢查等場景。

注解的基本概念
  • 元數據:描述數據的數據,注解本身不包含業務邏輯
  • 可被工具讀取:編譯器、IDE 或其他工具可以解析注解
  • 可保留到不同階段:源碼期、編譯期或運行期
注解的分類
  • 標準注解:Java 內置的注解

@Override:標記方法重寫
@Deprecated:標記過時元素
@SuppressWarnings:抑制編譯器警告
@SafeVarargs:Java 7+,標記安全的可變參數
@FunctionalInterface:Java 8+,標記函數式接口

  • 元注解:用于定義其他注解的注解

@Retention:指定注解保留策略
@Target:指定注解可應用的元素類型
@Documented:標記注解會被包含在 Javadoc 中
@Inherited:標記注解可被繼承
@Repeatable:Java 8+,標記注解可重復應用

  • 自定義注解:開發者根據需求定義的注解
    示例:
// 定義一個運行時保留的注解,可用于類和方法
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {// 注解屬性,有默認值String value() default "default value";int version() default 1;String[] authors();
}// 使用自定義注解
@MyAnnotation(value = "UserService", version = 2, authors = {"Alice", "Bob"})
public class UserService {@MyAnnotation(value = "getUser", authors = {"Alice"})public String getUser(int id) {return "User " + id;}
}// 解析注解
public class AnnotationParser {public static void main(String[] args) {// 解析類上的注解Class<UserService> clazz = UserService.class;if (clazz.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);System.out.println("類注解信息:");System.out.println("value: " + annotation.value());System.out.println("version: " + annotation.version());System.out.println("authors: " + Arrays.toString(annotation.authors()));}// 解析方法上的注解try {Method method = clazz.getMethod("getUser", int.class);if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("\n方法注解信息:");System.out.println("value: " + annotation.value());System.out.println("authors: " + Arrays.toString(annotation.authors()));}} catch (NoSuchMethodException e) {e.printStackTrace();}}
}
注解的保留策略

@Retention注解指定了注解的保留策略:

  • SOURCE:僅保留在源碼中,編譯時會被丟棄
    用途:編譯期檢查(如@Override)、IDE 語法提示
  • CLASS:保留到編譯期,會被寫入 class 文件,但 JVM 運行時不加載
    用途:字節碼增強、APT 處理
  • RUNTIME:保留到運行期,可通過反射獲取
    用途:運行時動態處理(如 Spring 的@Autowired)

APT(Annotation Processing Tool)

APT 是 Java 的注解處理工具,它可以在編譯期掃描和處理注解,生成額外的源文件或其他文件(通常是.java 文件)。APT 的核心優勢是在編譯期處理注解,避免了運行時反射帶來的性能開銷。

APT 的工作原理

  • 編譯器在編譯過程中檢測到注解處理器
  • 注解處理器掃描源代碼中的注解
  • 處理器根據注解信息生成新的 Java 代碼
  • 編譯器編譯原始代碼和生成的代碼
APT 的應用場景
  • 代碼生成:如 Dagger、ButterKnife 等依賴注入框架
  • 數據綁定:如 Android Data Binding
  • ORM 映射:自動生成數據庫操作代碼
  • 路由框架:如 ARouter 生成路由表
  • 事件總線:如 EventBus 生成訂閱代碼
  • 實現自定義 APT 處理器
    實現一個 APT 處理器需要以下步驟:
  • 創建注解處理器類,繼承AbstractProcessor
  • 重寫process()方法處理注解
  • 配置處理器(使用@SupportedAnnotationTypes和@SupportedSourceVersion)
  • 注冊處理器(使用 SPI 機制)
  • 使用處理器生成代碼
// 自定義注解(需要單獨定義)
@Retention(RetentionPolicy.SOURCE) // 僅在源碼期保留,供APT處理
@Target(ElementType.TYPE)
public @interface GenerateToString {
}// APT處理器
@SupportedAnnotationTypes("com.example.GenerateToString") // 指定處理的注解
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyAnnotationProcessor extends AbstractProcessor {private Filer filer; // 用于生成文件private Messager messager; // 用于輸出信息@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);filer = processingEnv.getFiler();messager = processingEnv.getMessager();}@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {// 遍歷所有被@GenerateToString注解的元素for (Element element : roundEnv.getElementsAnnotatedWith(GenerateToString.class)) {// 檢查元素是否是類if (element.getKind() != ElementKind.CLASS) {messager.printMessage(Diagnostic.Kind.ERROR, "@GenerateToString只能用于類", element);continue;}TypeElement typeElement = (TypeElement) element;generateToStringClass(typeElement);}return true; // 表示注解已被處理}private void generateToStringClass(TypeElement typeElement) {String className = typeElement.getSimpleName().toString();String packageName = processingEnv.getElementUtils().getPackageOf(typeElement).getQualifiedName().toString();// 生成的類名String generatedClassName = className + "ToString";try {// 創建輸出文件JavaFileObject jfo = filer.createSourceFile(packageName + "." + generatedClassName, typeElement);try (Writer writer = jfo.openWriter()) {// 生成代碼writer.write("package " + packageName + ";\n\n");writer.write("public class " + generatedClassName + " {\n\n");writer.write("    public static String toString(" + className + " obj) {\n");writer.write("        return \"" + className + "{\");\n");// 遍歷類的字段,生成toString內容List<? extends Element> elements = typeElement.getEnclosedElements();for (Element enclosedElement : elements) {if (enclosedElement.getKind() == ElementKind.FIELD) {VariableElement field = (VariableElement) enclosedElement;String fieldName = field.getSimpleName().toString();writer.write("        + \"" + fieldName + "=\" + obj." + fieldName + " + \", \");\n");}}writer.write("        + \"}\";\n");writer.write("    }\n");writer.write("}\n");}} catch (IOException e) {messager.printMessage(Diagnostic.Kind.ERROR, "生成代碼失敗: " + e.getMessage());}}
}

#注冊 APT 處理器

要讓編譯器找到并使用你的注解處理器,需要進行注冊:

  • 使用 SPI 機制:

創建文件 src/main/resources/META-INF/services/javax.annotation.processing.Processor
文件內容為處理器的全限定類名:com.example.MyAnnotationProcessor

  • 使用注解處理器庫(推薦):
    使用 Google 的 auto-service 庫自動生成注冊文件:
  1. 添加依賴

    • Maven 項目:
      <dependency><groupId>com.google.auto.service</groupId><artifactId>auto-service</artifactId><version>1.0.1</version><scope>provided</scope>
      </dependency>
      
    • Gradle 項目:
      implementation 'com.google.auto.service:auto-service:1.0.1'
      annotationProcessor 'com.google.auto.service:auto-service:1.0.1'
      
  2. 創建服務接口

    public interface MyService {void doSomething();
    }
    
  3. 實現服務

    import com.google.auto.service.AutoService;@AutoService(MyService.class)
    public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {System.out.println("Doing something...");}
    }
    
  4. 編譯項目

    • 使用 Maven 或 Gradle 編譯項目后,會在 META-INF/services 目錄下自動生成服務注冊文件
    • 文件名為接口全限定名(如 com.example.MyService
    • 文件內容是實現類全限定名(如 com.example.MyServiceImpl
  5. 使用 ServiceLoader 加載服務

    ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class);
    for (MyService service : loader) {service.doSomething();
    }
    
  6. 優勢

    • 自動生成服務注冊文件,避免手動編寫出錯
    • 簡化 SPI(Service Provider Interface)實現
    • 支持多模塊項目中的服務發現
    • 與 Google 的其他工具(如 Guice)良好集成
  7. 注意事項

    • 確保編譯時注解處理器已正確配置
    • 在多模塊項目中,服務接口和實現可能需要在不同模塊
    • 如果要支持 JDK 9+ 的模塊系統,還需要在 module-info.java 中聲明服務提供者使用 Google 的auto-service庫自動生成注冊文件:
使用 APT 生成的代碼
// 使用我們的注解
@GenerateToString
public class User {private String name;private int age;private String email;public User(String name, int age, String email) {this.name = name;this.age = age;this.email = email;}// getter和setter方法public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }
}// 使用APT生成的代碼
public class UserExample {public static void main(String[] args) {User user = new User("Alice", 30, "alice@example.com");// 調用APT生成的toString方法String str = UserToString.toString(user);System.out.println(str); // 輸出: User{name=Alice, age=30, email=alice@example.com, }}
}
// APT會自動生成UserToString類,無需手動編寫

注解的優勢

簡化代碼結構:注解通過元數據形式直接附加在代碼上,減少樣板代碼(如 XML 配置),提升可讀性。
編譯時檢查:注解可在編譯時通過處理器(Annotation Processor)驗證邏輯錯誤,避免運行時問題。
自動化生成代碼:結合 APT 自動生成重復性代碼(如 ButterKnife 的視圖綁定),減少手動編寫工作量。
框架集成:Spring、Hibernate 等框架通過注解簡化配置(如 @Autowired@Entity),提升開發效率。

APT(Annotation Processing Tool)的優勢

編譯時處理:APT 在編譯階段生成代碼或報告錯誤,不影響運行時性能。
類型安全:生成的代碼基于編譯器解析的抽象語法樹(AST),避免反射帶來的類型安全問題。
可擴展性:支持自定義注解處理器,滿足特定需求(如 Dagger 的依賴注入生成)。
與構建工具集成:Maven/Gradle 可無縫集成 APT,自動化處理注解并生成代碼。

注解與 APT 的協同效應

解耦與模塊化:APT 將注解邏輯分離到獨立模塊,保持業務代碼簡潔。
性能優化:編譯時生成代碼替代運行時反射(如 Retrofit 的接口動態代理),提高執行效率。
錯誤前置:APT 在編譯時捕獲注解使用錯誤(如缺失必需參數),降低調試成本。

典型應用場景

  • 數據綁定:Android 的 @BindView 生成視圖綁定代碼。
  • API 封裝:Retrofit 通過注解定義 HTTP 請求,APT 生成實現類。
  • 依賴注入:Dagger 利用 @Inject 和 APT 自動生成依賴關系代碼。

代碼生成示例(Markdown 格式)

// 自定義注解
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface BindView {int value();
}// APT 生成的代碼(簡化版)
public class MainActivity_ViewBinder {public static void bind(MainActivity activity) {activity.button = activity.findViewById(R.id.btn_submit);}
}

通過注解與 APT 的結合,開發者能高效實現代碼生成、驗證和優化,平衡靈活性與性能。### 反射與 APT 的基本概念
反射(Reflection) 是一種在運行時動態獲取類信息、調用方法或操作字段的機制,通過 Java 的 java.lang.reflect 包實現。
APT(Annotation Processing Tool) 是一種編譯時處理注解的工具,通過生成代碼或文件在編譯階段完成操作,不涉及運行時開銷。

執行時機差異

反射在程序運行時動態解析類信息,可能導致性能損耗。
APT 在編譯時處理注解,生成額外的代碼或資源文件,對運行時性能無影響。

性能對比

反射因運行時動態解析,調用速度較慢,頻繁使用可能影響程序性能。
APT 生成的代碼是靜態的,與手寫代碼性能一致,無額外開銷。

使用場景

反射適用于需要動態加載類或調用方法的場景(如框架、插件系統)。
APT 適用于編譯時代碼生成(如 ButterKnife、Lombok 等庫的注解處理)。

代碼侵入性

反射需要依賴運行時環境,可能引發安全或兼容性問題。
APT 生成的代碼直接融入項目,無運行時依賴,但需配置注解處理器。

典型應用示例

反射:Spring 框架的依賴注入、動態代理實現。
APT:Dagger2 的依賴注入生成、Android 的 ViewBinding 處理。

優缺點總結

反射

  • 優點:靈活性高,支持運行時動態操作。
  • 缺點:性能較低,可能觸發安全異常。

APT

  • 優點:編譯時完成,無運行時損耗。
  • 缺點:靈活性受限,需預先定義注解處理邏輯。

選擇建議

需要動態行為時選擇反射,追求性能或編譯時確定性時選擇 APT。兩者也可結合使用(如反射+APT生成模板代碼)。以下是網絡安全領域中常用的APT(高級持續性威脅)相關框架和工具庫的整理,涵蓋攻擊模擬、漏洞利用、隱蔽通信等方向:

MITRE ATT&CK 框架

  • 用途:標準化APT攻擊技術分類,覆蓋初始訪問、持久化、橫向移動等全生命周期。
  • 特點:提供TTPs(戰術、技術、程序)矩陣,被廣泛用于紅隊演練和威脅檢測。
  • 資源:開源矩陣庫,支持企業級映射(如CARTA、NDR)。

Cobalt Strike

  • 功能:商業化滲透測試工具,常用于模擬APT攻擊鏈。
  • 模塊:Beacon后門、釣魚攻擊包、C2服務器隱蔽通信。
  • 擴展:支持Aggressor Script腳本定制攻擊行為。

Metasploit Framework

  • 核心:模塊化漏洞利用庫,集成超過2000個Exploit模塊。
  • 應用場景:快速武器化漏洞(如ProxyLogon)、生成Shellcode。
  • 衍生:Metasploit Pro支持APT級橫向移動自動化。

Sliver

  • 定位:開源C2框架,替代Cobalt Strike的輕量級方案。
  • 特性:多協議支持(HTTP/DNS)、動態代碼加載、反沙箱技術。

PowerSploit

  • 類型:PowerShell攻擊庫
  • 模塊
    • Invoke-Mimikatz:Windows憑據竊取
    • Invoke-Tater:NTLM中繼攻擊
    • Get-Keystrokes:鍵盤記錄

Empire

  • 架構:基于Python的C2框架,支持模塊化后門。
  • 特點:無文件攻擊、內存注入、與PowerShell深度集成。

Covenant

  • 技術棧:.NET編寫的協作型C2框架
  • 優勢:Web界面管理多團隊協作,支持API擴展。

Merlin

  • 協議:使用HTTP/2和gRPC的隱蔽通信框架
  • 適用場景:繞過網絡流量檢測,低延遲C2通信。

其他工具庫

  • SharPyShell:.NET Web Shell生成器
  • DNSCat2:基于DNS隧道的C2工具
  • PoshC2:專注于隱蔽通信的PowerShell框架

防御側工具

  • Caldera:MITRE開源的自動化對抗模擬平臺
  • Atomic Red Team:ATT&CK技術對應的原子測試用例庫

以上工具需在合法授權環境下使用,企業安全團隊常基于這些框架構建攻防演練環境。

總結

注解是一種強大的元數據機制,而 APT 則是處理注解的強大工具。它們共同構成了現代 Java 開發中代碼生成和元編程的基礎。

通過注解標記代碼意圖,結合 APT 在編譯期自動生成輔助代碼,可以顯著提高開發效率,同時避免運行時反射帶來的性能問題。

在實際開發中,我們既可以使用成熟的 APT 框架,也可以根據需求實現自定義的注解處理器,為項目帶來更大的靈活性和效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98046.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity 檢測網絡-判斷當前(Android/Windows平臺)設備是否連接了指定WiFi

判斷設備是否連接了特定的網絡1.Unity 腳本2.Unity AndroidManifest.xml文件①改個設置②補充權限語句1.Unity 腳本 using UnityEngine; using System.Collections; using System.Diagnostics; using Debug UnityEngine.Debug; using UnityEngine.UI;#if UNITY_ANDROID &…

通過網絡強化增強混合IT環境的安全

網絡是企業運營的支柱&#xff0c;也是網絡犯罪分子和惡意威脅者的主要目標&#xff0c;他們會破壞IT運營的連續性。隨著混合云基礎設施、遠程辦公和物聯網&#xff08;IoT&#xff09;生態系統的出現&#xff0c;網絡邊界正在不斷擴大&#xff0c;新的漏洞不斷產生&#xff0c…

ACP(四):RAG工作流程及如何創建一個RAG應用

RAG的工作原理 你在考試的時候有可能會因為忘記某個概念或公式而失去分數&#xff0c;但考試如果是開卷形式&#xff0c;那么你只需要找到與考題最相關的知識點&#xff0c;并加上你的理解就可以進行回答了。 對于大模型來說也是如此&#xff0c;在訓練過程中由于沒有見過某個知…

宇視設備視頻平臺EasyCVR視頻設備軌跡回放平臺監控攝像頭故障根因剖析

監控攝像頭的類型繁多&#xff0c;市場上提供了廣泛的選擇。然而&#xff0c;在使用監控攝像頭的過程中&#xff0c;用戶可能會遇到云臺在很短的時間內出現運轉不靈或完全無法轉動的問題。這里&#xff0c;我們將對這一常見問題進行深入分析。一、具體的原因&#xff1a; 1、距…

【Uni-App+SSM 寵物項目實戰】Day15:購物車添加

大家好!今天是學習路線的第15天,我們正式進入訂單與購物車核心模塊。昨天完成了商家服務列表的分頁加載,今天聚焦“購物車添加”功能——這是連接“商品瀏覽”與“訂單提交”的關鍵環節,用戶可將寵物用品(如糧食、玩具)加入購物車,后續統一結算。 為什么學這個? 購物車…

Java 黑馬程序員學習筆記(進階篇6)

常用的 API1. 正則表達式(1) 題目&#xff1a;貪婪爬取和非貪婪爬取① 貪婪爬取&#xff1a;爬取數據的時候盡可能的多獲取數據 ② 非貪婪爬取&#xff1a;爬取數據的時候盡可能的少獲取數據 ③ Java中默認的是貪婪爬取 ④ 后面加上 ? 可以轉變為非貪婪爬取(2) 捕獲分組捕獲分…

計算機網絡---數據鏈路層上

文章目錄1. 數據鏈路層的功能2. 組幀2.1 字符填充法2.2 字節填充法2.3 零比特填充法2.4 違規編碼2.5 總結3. 差錯控制3.1 檢錯編碼3.1.1 奇偶校驗3.1.2 循環冗余校驗碼&#xff08;CRC&#xff09;3.1.3 總結3.2 糾錯編碼&#xff08;海明校驗碼&#xff09;3.3 總結4. 流量控制…

機器學習實戰項目中,回歸與分類模型中該如何科學定義目標變量Y?

前言 在機器學習項目里&#xff0c;目標變量 (Y) 的定義決定了你能解答什么問題&#xff0c;以及模型能給業務帶來什么價值。選擇不當不僅可能導致模型誤差大、偏差嚴重&#xff0c;還可能讓業務決策方向偏離。 本文分兩大場景&#xff1a; 供應鏈項目中的 銷量預測&#xff08…

【 C/C++ 算法】入門動態規劃-----一維動態規劃基礎(以練代學式)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是動態規劃算法的基礎入門篇&#xff0c;我將通過三道簡單題 一道中等難度的一維動態規劃題來帶你對動態規劃有個初認識&#xff0c;并基本了解動…

深入對比Tomcat與Netty:HTTP請求從網卡到Controller的全鏈路追蹤

我們日常用Spring Boot寫的RestController&#xff0c;感覺上就是一個簡單的方法&#xff0c;但它背后其實有一套復雜的網絡服務在支撐。一個HTTP請求到底是怎么從用戶的瀏覽器&#xff0c;穿過層層網絡&#xff0c;最終抵達我們代碼里的Controller方法的&#xff1f;理解這個過…

GO學習記錄十——發包

記錄下不同平臺的發包操作和期間遇到的問題 1.命令&#xff1a; $env:GOOSlinux $env:GOARCHamd64 go build -o release/HTTPServices-linux第一行&#xff0c;配置平臺&#xff0c;linux、windows 第二行&#xff0c;配置部署服務器的處理器架構 第三行&#xff0c;輸出目標文…

貪心算法與動態規劃

1. 什么是貪心算法&#xff1f; 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法。 核心思想&#xff1a;“每步都貪心地選擇眼前最好的&#xff0c;不去考慮整個未來的長…

學會“讀網頁”:生成式 AI 在足球賽事信息整理中的實戰

逐步教程&#xff08;Step-by-Step&#xff09; — 適合初學者與教學類文章 背景&#xff08;為什么要這樣做&#xff09; 對于足球迷、資訊編輯與數據分析師來說&#xff0c;最快、最準確把握一場比賽的核心信息至關重要&#xff1a;比分、關鍵事件&#xff08;進球、點球、紅…

BM3D 圖像降噪快速算法的 MATLAB 實現

BM3D 圖像降噪快速算法的 MATLAB 實現1. 快速 BM3D 算法流程&#xff08;概述&#xff09;步驟操作加速技巧① 分組塊匹配 堆疊FFT 互相關② 協同濾波3D 變換 硬閾值FFT 沿第三維③ 聚合加權平均稀疏矩陣累加 2. 核心函數&#xff08;單文件版&#xff09; 保存為 bm3d_fast.…

Go的schedt調度(runtime/proc.go)

1. 創建go的入口函數// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服務器配置轉發網絡訪問

配置文檔&#xff1a;Ubuntu 服務器轉發網絡訪問 一、網絡拓撲以以下網絡拓撲為示例Ubuntu 服務器&#xff08;兩個網卡&#xff09; eth1 10.66.71.222 &#xff08;接入內網&#xff09;eno1 192.168.2.100 &#xff08;直連相機&#xff09; 相機ip 192.168.2.1 Windows 客…

為什么企業需要高防IP

1. 抵御日益猖獗的DDoS攻擊 現代DDoS攻擊規模已突破Tbps級別 傳統防火墻無法應對大規模流量攻擊 高防IP采用分布式清洗中心&#xff0c;可輕松抵御300Gbps以上的攻擊流量 2. 保障業務連續性 網絡中斷1小時可能造成數百萬損失 高防IP確保服務99.99%可用性 智能切換機制實…

CSS基礎 - 選擇器備忘錄 --筆記5

目錄基礎選擇器組合器偽類選擇器屬性選擇器選擇器可以選中頁面上的特定元素并為其指定樣式。 CSS有多種選擇器。 基礎選擇器 標簽選擇器 – tagname&#xff1a;匹配目標元素的標簽名。優先級是0,0,1。如&#xff1a;p、h1、div類選擇器 – .class&#xff1a;匹配class屬性中…

自動駕駛中的傳感器技術46——Radar(7)

衛星雷達&#xff08;又稱為分布式雷達&#xff09;主要講當前雷達的雷達信號處理計算以及雷達目標相關的一些感知算法都遷移到中央域控進行&#xff0c;雷達端基本只負責數據采集&#xff0c;這樣做的影響如下&#xff1a; 雷達端成本與功耗降低&#xff1b; 雷達端采樣得到的…

【論文閱讀】Diff-Privacy: Diffusion-based Face Privacy Protection

基于擴散模型的人臉隱私保護方法——DiffPrivacy&#xff0c;解決了兩類人臉隱私任務&#xff1a;匿名化&#xff08;anonymization&#xff09;和視覺身份信息隱藏&#xff08;visual identity information hiding&#xff09;。1. 研究背景隨著人工智能和大數據技術的普及&am…