【Android】Android 實現一個依賴注入的注解

Android 實現一個依賴注入的注解

🎯 目標功能

  • 自定義注解 @Inject
  • 創建一個 Injector 類,用來掃描并注入對象
  • 支持 Activity 或其他類中的字段注入

🧩 步驟一:定義注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {
}

🧩 步驟二:實現注入邏輯

import java.lang.reflect.Field;public class Injector {public static void inject(Object target) {Class<?> clazz = target.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Inject.class)) {try {Class<?> type = field.getType();Object instance = type.newInstance(); // 也可以用構造器緩存池優化field.setAccessible(true);field.set(target, instance);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("Failed to inject " + field.getName());}}}}
}

🧩 步驟三:使用示例

要實例化的對象類

import android.util.Log;public class Service {public void doSomething() {System.out.println("Service is working");Log.i("ServiceTAG", "Service is doSomething");}
}

在MainActivity注入

public class MainActivity extends AppCompatActivity {@InjectService service;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 注入邏輯Injector.inject(this); // 使用注入的對象service.doSomething(); }
}

? 補充建議

  • 為了更靈活,你可以改用 構造器注入單例管理
  • 如果要支持參數構造函數、依賴圖、作用域管理,可以逐步擴展。
  • 如果你對性能敏感,可以考慮使用 APT(注解處理器) 生成代碼。

逐段解釋一下上述代碼:

🔧 一、自定義注解 @Inject

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {
}
? 解讀:
  • @Target(ElementType.FIELD)
    表示這個注解只能用于 字段上,不能用于類、方法等。
  • @Retention(RetentionPolicy.RUNTIME)
    表示這個注解在 運行時依然存在,這樣我們就可以通過反射獲取它。
  • public @interface Inject {}
    這是定義了一個名為 Inject 的注解,它 不包含任何參數,只作為標記使用。

🧠 二、注入器類 Injector

public class Injector {public static void inject(Object target) {Class<?> clazz = target.getClass();Field[] fields = clazz.getDeclaredFields();
? 解讀:
  • inject(Object target):這是一個靜態方法,接收需要注入依賴的對象,比如 Activity
  • target.getClass():獲取目標類的 Class 對象。
  • clazz.getDeclaredFields():獲取這個類里 聲明的所有字段(不管是私有還是公有)。
        for (Field field : fields) {if (field.isAnnotationPresent(Inject.class)) {
? 解讀:
  • 遍歷所有字段,檢查有沒有使用我們自定義的 @Inject 注解。

              try {Class<?> type = field.getType();Object instance = type.newInstance(); // 創建實例
    
? 解讀:
  • field.getType():獲取字段的類型,比如是 Service.class
  • type.newInstance():用 默認無參構造函數 實例化對象。

?? 這里假設被注入的類必須有一個無參構造函數。

                    field.setAccessible(true);field.set(target, instance);
? 解讀:
  • setAccessible(true):允許訪問私有字段。
  • field.set(target, instance):將我們創建好的實例注入到目標對象的字段中。

                } catch (Exception e) {e.printStackTrace();throw new RuntimeException("Failed to inject " + field.getName());}}}}
}
? 解讀:
  • 如果注入失敗就打印異常并拋出運行時異常,方便調試。

💡 三、使用方式解析

public class MainActivity extends AppCompatActivity {@InjectService service;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Injector.inject(this); // 調用注入器注入service.doSomething(); // 使用注入后的 service}
}
? 解讀:
  • 使用了 @Inject 標記字段,告訴注入器需要注入這個字段。
  • Injector.inject(this):告訴系統對這個對象(MainActivity)做依賴注入。
  • service.doSomething():使用注入后的對象方法。

📌 總結核心原理

步驟描述
1定義注解,告訴系統哪些字段要注入
2通過反射找出所有有注解的字段
3為這些字段創建對應實例
4把實例賦值給這些字段

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

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

相關文章

Spring Boot與Kafka集成實踐:從入門到實戰

Spring Boot與Kafka集成實踐 引言 在現代分布式系統中&#xff0c;消息隊列是不可或缺的組件之一。Apache Kafka作為一種高吞吐量的分布式消息系統&#xff0c;廣泛應用于日志收集、流處理、事件驅動架構等場景。Spring Boot作為Java生態中最流行的微服務框架&#xff0c;提供…

ubuntu的虛擬機上的網絡圖標沒有了

非正常的關機導致虛擬機連接xshell連接不上&#xff0c;ping也ping不通。網絡的圖標也沒有了。 記錄一下解決步驟 1、重啟服務 sudo systemctl restart NetworkManager 2、圖標顯示 sudo nmcli network off sudo nmcli network on 3、sudo dhclient ens33 //(網卡) …

生產者 - 消費者模式實現方法整理

一、Channels &#xff08;一&#xff09;使用場景 適用于高并發、大數據量傳輸&#xff0c;且需要異步操作的場景&#xff0c;如實時數據處理系統。 &#xff08;二&#xff09;使用方法 創建 Channel<T>&#xff08;無界&#xff09;或 BoundedChannel<T>&…

OpenCV光流估計:原理、實現與應用

一、什么是光流&#xff1f; 光流(Optical Flow)是計算機視覺中描述圖像序列中像素運動模式的重要概念。它表示圖像中物體在連續幀之間的表觀運動&#xff0c;是由物體或相機的運動引起的。 光流的基本假設 亮度恒常性&#xff1a;同一物體點在連續幀中的亮度保持不變時間持…

Java實現MinIO上傳PDF文件并配置瀏覽器在線打開及vue2上傳頁面

win下載啟動minio結合vue2實現文件上傳瀏覽 一.下載啟動minio 1. 下載minio 2.在D盤創建文件夾 1.首先創建minio文件夾再minio中依次創建bin/data/logs,如下圖 2.把下載的minio.exe放到minio->bin文件中 3.在bin文件夾中輸入cmd打開命令框輸入命令minio.exe server D:…

VR 互動實訓與展示,借科技開啟沉浸式體驗新篇?

對于企業而言&#xff0c;產品設計與展示是極為關鍵的環節&#xff0c;這直接關系到能否成功吸引客戶&#xff0c;以及精準獲取市場反饋。在當下科技飛速發展的時代&#xff0c;VR 互動實訓為這一至關重要的環節注入了全新活力&#xff0c;帶來了前所未有的體驗。以某智能家居企…

進階-數據結構部分:1、數據結構入門

飛書文檔https://x509p6c8to.feishu.cn/wiki/HRLkwznHiiOgZqkqhLrcZNqVnLd 一、存儲結構 順序存儲 鏈式存儲 二、常用數據結構 2.1、棧 先進后出 場景&#xff1a; 后退/前進功能&#xff1a;網頁瀏覽器中的后退和前進按鈕可以使用棧來實現。在瀏覽網頁時&#xff0c;每次…

HarmonyOS Navigation組件深度解析與應用實踐

HarmonyOS Navigation組件深度解析與應用實踐 一、組件架構與核心能力 HarmonyOS Navigation組件作為路由導航的根視圖容器&#xff0c;采用三層架構設計&#xff1a; 標題層&#xff1a;支持主副標題配置&#xff0c;提供Mini/Free/Full三種顯示模式內容層&#xff1a;默認…

基于AI的Web數據管道,使用n8n、Scrapeless和Claude

引言 在當今數據驅動的環境中&#xff0c;組織需要高效的方法來提取、處理和分析網絡內容。傳統的網絡抓取面臨著諸多挑戰&#xff1a;反機器人保護、復雜的JavaScript渲染以及持續的維護需求。此外&#xff0c;理解非結構化的網絡數據則需要復雜的處理能力。 本指南演示了如…

Cadence學習筆記之---PCB器件放置與布局

目錄 01 | 引 言 02 | 環境描述 03 | 元件放置 04 | 布局相關操作 06 | 總 結 01 | 引 言 在上一篇文章中&#xff0c;介紹了如何設置PCB的電氣規則約束&#xff0c;以及如何設置層疊&#xff0c;到此我們已經完成了使用Cadence設計PCB的前期準備工作&#xff1b; 在本篇…

力扣HOT100之二叉樹:199. 二叉樹的右視圖

這道題沒啥好說的&#xff0c;首先定義一個向量來保存每一層的最后一個元素&#xff0c;直接用層序遍歷&#xff08;廣度優先搜索&#xff09;遍歷二叉樹&#xff0c;然后將每一層的最后一個元素加入到這個向量中即可。屬于是二叉樹層序遍歷的模板題。 /*** Definition for a …

CSS:三大特性

文章目錄 一、層疊性二、繼承性三、優先級 一、層疊性 二、繼承性 可以在MDN網站上查看屬性是否可以被繼承 例如color 三、優先級

C++經典庫介紹

在 C 開發的漫長歷程中&#xff0c;涌現出了許多經典的庫&#xff0c;它們在不同的領域發揮著重要作用&#xff0c;極大地提升了 C 開發的效率和質量。下面為你介紹一些 C 開發中的經典庫。 標準模板庫&#xff08;STL&#xff09; STL 堪稱 C 編程領域的基石&#xff0c;是每…

Git本地使用小Tips

要將本地倉庫 d:\test 的更新推送到另一個本地倉庫 e:\test&#xff0c;可以使用 Git 的遠程倉庫功能。以下是具體步驟&#xff1a; ??在 e:\test 中添加 d:\test 作為遠程倉庫?? 在 e:\test 目錄中打開 Git Bash 或命令行&#xff0c;執行以下命令&#xff1a; git remo…

AWS SageMaker vs Bedrock:該選哪個?

隨著生成式 AI 的快速崛起&#xff0c;越來越多企業希望借助云上工具&#xff0c;加速 AI 應用的構建與落地。AWS 作為領先的云服務提供商&#xff0c;提供了兩款核心 AI 服務&#xff1a;Amazon SageMaker 和 Amazon Bedrock。它們雖然同屬 AWS AI 生態系統&#xff0c;但定位…

51單片機的lcd12864驅動程序

#include <reg51.h> #include <intrins.h>#define uchar

Git .gitattributes 文件用途詳解

.gitattributes 是 Git 版本控制系統中的一個配置文件&#xff0c;用于定義特定文件或路徑的屬性&#xff0c;從而控制 Git 如何處理這些文件。它類似于 .gitignore&#xff0c;但功能更廣泛&#xff0c;可以精細化管理文件在版本控制中的行為。 主要用途 以下是 .gitattribut…

使用 Apache POI 生成 Word 文檔

創建一個包含標題、段落和表格的簡單文檔。 步驟 1:添加依賴 確保你的項目中已經添加了 Apache POI 的依賴。如果你使用的是 Maven,可以在 pom.xml 中添加以下內容: <dependency><groupId>org.apache.poi</groupId>

數據中心 智慧機房解決方案

該文檔介紹數據中心智慧機房解決方案,涵蓋模塊化數據中心(機柜式、微模塊),具備低成本快速部署、標準化建設等特點;監控管理系統(DCIM)可實現設施、資產、容量、能效管理;節能解決方案含精密空調節能控制柜,節能率高達 30%;還有7X24 小時云值守運維服務。方案亮點包括…

java -jar命令運行 jar包時如何運行外部依賴jar包

java -jar命令運行 jar包時如何運行外部依賴jar包 場景&#xff1a; 打包發不完,運行時。發現一個問題&#xff0c; java java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils 顯示此&#xff0c;基本表明&#xff0c;沒有這個依賴&#xff0c;如果在開發…