簡體   English   中英

如何在java中獲取字段引用?

[英]How to get a field reference in java?

我試圖在java中獲得編譯時安全字段引用,不使用反射和字符串,而是直接引用該字段。 就像是

MyClass::myField

我嘗試了通常的反射方式,但是您需要將字段引用為字符串,這在重命名的情況下容易出錯,並且不會拋出編譯時錯誤

編輯:只是想澄清一下,我的最終目標是獲取字段 NAME 用於實體目的,例如在查詢中引用實體字段,而不是值

不幸的是,您可能還想擁有一只獨角獸。 在您要求的意義上,“字段引用”的概念根本不是 java-the-language 的一部分。

MyClass::myThing語法適用於方法。 字段根本沒有這樣的東西。 很不幸。

任何語言的設計決策都很難給出客觀的理由; 它要么需要探索設計師的集體頭腦,這需要魔法或科幻小說,要么要求他們把豆子灑出來,在堆棧溢出問題中他們可能不會這樣做。 有時(以及最近的 Java 特性,比如這個),設計會在公共場合進行辯論。 具體來說,您可以搜索 openjdk lamba-dev郵件列表,其中無疑涵蓋了這個問題。 你需要瀏覽,我沒有誇大其詞,數以萬計的帖子,但是,好消息是,它是可搜索的

但是,當我花了一些時間討論 Lambda 項目的設計時,我可以猜測/挖掘自己的記憶:

直接字段訪問在 Java 生態系統中並不常見。 該語言允許直接字段訪問,但很少有 Java 程序是以這種方式編寫的,所以為什么要創建一個只會立即對異國情調的一群人立即有用和熟悉的語言功能。

所需的基礎設施也相當重要 - 不允許用 java 編寫方法 lambda,除非您在使編譯器可以將 lambda 視為一種類型的上下文中使用它 - 特別是@FunctionalInterface -任何只包含 1 個方法的接口(除了 jlObject 本身已經存在的方法)。 換句話說,這很好:

Function<String, String> f = String::toLowerCase;

但這不是:

Object o = String::toLowerCase;

所以,讓我們想象一下,字段 refs 確實存在。 這意味着什么? 表達式MyClass::myField的“類型”是什么? 也許是一個新概念:一個帶有2 個方法的接口; 其中一個不帶參數並返回 T,另一個想要 T 並且不返回任何內容(以匹配讀取和寫入字段的行為),但如果它是其中之一的 FunctionalInterface 也是可以接受的,也許? 這聽起來很復雜。

Java 設計團隊現在(並且已經有一段時間了)的一般心態是不要使事情過於復雜:除非有充分的理由,否則不要添加功能。 畢竟,如果事實證明社區真的在要求現場裁判,他們可以添加。 但是,另一方面,如果添加了它們但沒有人使用它們,它們就不能被刪除(因此,您現在永久地使語言變得更加復雜,並減少了未來語言功能的空間,用於無人使用且大多數風格指南告訴你要積極避免)。

那就是,我很確定,為什么它們不存在。

在您的類中,創建一個返回您嘗試獲取的引用的方法。 例子:

class Myclass {
    Object myfield;

    public Object getMyfield() {
        return myfield;
    }
}

現在您應該可以使用

Myclass::myfield

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM