問題陳述:
Java Reflection可用於檢索變數名稱本地聲明的變數?給出如下程式碼片段:
Foo b = new Foo(); Foo a = new Foo(); Foo r = new Foo();
我們能否發展出精確定位變數名稱的方法,例如:
public void baz(Foo... foos) { for (Foo foo : foos) { // Print the name of each foo - b, a, and r System.out.println(***); // Placeholder for variable name access } }
解決方案:
直到 Java 8,透過反射檢索局部變數名稱是不可能的。但是,該版本中引入了部分支援。參數名稱是一種特殊類型的局部變量,可以透過反射來存取。事實證明,這對於替換依賴注入框架常用的 @ParameterName 等註釋很有用。
為了獲得更全面的局部變數名稱信息,檢查類別文件可能會提供一些見解。在編譯過程中,最佳化技術有時會消除這些資料以節省空間。但是,如果存在,方法的局部變數表屬性會列出其各自指令範圍內的變數類型和名稱。
字節碼工程工具(例如 ASM)可以潛在地提供在運行時檢查此資訊的機制。鑑於此功能主要在開發環境中的利基應用,此類程式庫提供的補充功能不僅僅是提取變數名稱。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3