簡體   English   中英

是否可以使用反射[在Java中]獲取集合(例如列表)的元素

[英]Is it possible to get elements of a Collection (e.g. List) using reflection [in Java]

我已經完成了我的研究,但如果可能與否,我仍然無法調用它。 這個問題聽起來像是一個特例。 但是,我試圖盡可能地概括它。

在 Java 中,我知道可以使用反射來公開對象的字段(比如x )。 而且我知道可以更深入地公開 a 子對象的字段,例如x的字段。 然而,當涉及到通用對象時,這變得很棘手。

為了更好地解釋這一點,假設我們有以下兩個簡單的類:

package reflection;

import java.util.*;

public class Subject {

    public List<SomeUserDefinedObj> myListOfObj =
            new ArrayList<SomeUserDefinedObj>();

    public SomeUserDefinedObj singleObj = new SomeUserDefinedObj();

    public Subject(){
        myListOfObj.add(new SomeUserDefinedObj());
    }

}

package reflection;

public class SomeUserDefinedObj {

    public int x;

}

我們有以下測試類將通過反射檢查Subject

package reflection;

import java.lang.reflect.*;

public class Test {

    public static void main(String[] args) {
        Subject subject = new Subject();

        Class<?> c = subject.getClass();   
        for (Field field:c.getDeclaredFields()){
            System.out.println("Field in " + c.getName() + ": " + field.getName());

            Class<?> nestedClass = field.getType();
            for (Field nestedField:nestedClass.getDeclaredFields()){
                System.out.println("\tField in " + nestedClass.getName() + ": " + nestedField.getName());
            }
        }        
    }
}

此測試的輸出將是:

Field in reflection.Subject: myListOfObj
Field in reflection.Subject: singleObj
    Field in reflection.SomeUserDefinedObj: x

現在,我們可以看到檢索到單個對象的內容,但列表好像是空的。 我知道有一些方法可以使用對象本身的實例獲取列表的類型(您可以從中迭代列表中的對象),例如來自Test subject like here 例如,我可以做Object myInstance = field.get(subject); 並且從他們我將能夠確定列表中元素的類型並迭代它們(經過測試和工作)。

但是,(在這里我的問題可能是具體的)我無權訪問該實例(由於使用遺留代碼,該設計阻止了這種奢侈)。 所以,我試圖通過僅使用反射類對象(例如來自Test c來達到這個目標。 我找到了一些資源,可以幫助我確定列表中元素的類型,如此此處(我測試了它們並且它們有效)。 但是,這(第一個)不會授予實際類型,因為該類型可能是抽象類,(第二個)無論類型是否抽象,我都看不到從那里獲取列表元素信息的任何方法。 據我所知,檢索給定此方法的類型只能保證它會返回使用列表而不是元素初始化的類型(甚至如解釋的那樣,類型可能不准確)。

最后,我已經閱讀了資源不穩固的狀態,如果是可以或不可以實現所有給予我所說的情況,例如目標(工作僅與反射對象不是對象的實際實例)。 那么,問題就變成了,是否可以在不使用反射訪問實際實例的情況下檢索 Collection 元素?

字段僅具有對應類的特定實例的值。

所以簡單的答案是:沒有實例,你不能訪問字段的值(除非字段是狀態)。

想象一個類代表一個盒子的藍圖。 當你現在對這樣一個盒子的內容感興趣時......你仍然需要一個真正的盒子來研究。

但是:當您能夠在應用程序運行的同一個 JVM 中執行代碼時……那么可能以某種方式訪問​​它們。 您需要找出您已知的其他對象是否可以包含您想要查看的那些盒子。

暫無
暫無

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

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