簡體   English   中英

Java-獲取某些類型的字段名稱

[英]Java - get fields names of certain types

我在下面有一個示例類,在此示例中,我想返回某種類型的所有類字段。

public class Contact {
    private String surname, lastname, address;
    private int age, floor;
    private Image contactPhoto, companyPhoto;
    private boolean isEmployed;

    public String[] getAllImages() {
        String images[] = // missing code
        return images;
        // in this case, I want to return {"contactPhoto","companyPhoto"}
    }
}

我在這里需要幫助。 如何找到特定類型的所有類字段。 我將在另一類ofc中調用此方法。

使用反射來訪問在類上聲明的字段。 然后遍歷這些字段,並檢查它們的類型是否與Image相匹配。

您還可以通過接受兩個參數target Class和searchType Class來創建更有用的方法。 然后,該方法將搜索target類型為searchType

我還建議將該方法設為靜態,因為它實際上並不依賴於任何類狀態。

public class Contact {
    private String surname, lastname, address;
    private int age, floor;
    private Image contactPhoto, companyPhoto;
    private boolean isEmployed;

    public static String[] getFieldsOfType(Class<?> target, Class<?> searchType) {

        Field[] fields  = target.getDeclaredFields();

        List<String> results = new LinkedList<String>();
        for(Field f:fields){
            if(f.getType().equals(searchType)){
                results.add(f.getName());
            }
        }
        return results.toArray(new String[results.size()]);
    }

    public static String[] getAllImages(){
        return getFieldsOfType(Contact.class, Image.class); 
    }

    public static void main(String[] args) {
        String[] fieldNames = getAllImages();

        for(String name:fieldNames){
            System.out.println(name);
        }
    }
}

使用反射的一種更簡單的替代方法是將地圖用作您感興趣的字段的主要數據類型:

public class Contact {

    private static final String CONTACT_PHOTO = "contactPhoto";
    private static final String COMPANY_PHOTO = "companyPhoto";

    private String surname, lastname, address;
    private int age, floor;
    private HashMap<String, Image> images;
    private boolean isEmployed;

    public Contact() {
        images = new HashMap<String, Image>();
        images.put(CONTACT_PHOTO, null);
        images.put(COMPANY_PHOTO, null);
    }

    public String[] getAllImages() {
        Set<String> imageNames = images.keySet();
        return imageNames.toArray(new String[imageNames.size()]);
    }

    public void setContactPhoto(Image img) {
        images.put(CONTACT_PHOTO, img);
    }

    public Image getContactPhoto() {
        return images.get(CONTACT_PHOTO);
    }

    public void setCompanyPhoto(Image img) {
        images.put(COMPANY_PHOTO, img);
    }

    public Image getCompanyPhoto() {
        return images.get(COMPANY_PHOTO);
    }
}

使用字段名稱作為值可能會引起麻煩。

如果需要用字符串標識單個圖像,則可以創建一個HashMap。 使用當前字段名稱作為鍵,並使用Image對象作為值。

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

您可以通過keySet()方法檢索所有鍵值(在您的情況下為名稱)

編輯:這是一個工作的示例類,從您的類派生而來,但僅包含相關字段:

import java.awt.Image;
import java.util.HashMap;
import java.util.Set;

public class Contact
{
    private HashMap<String, Image> images;

    public Contact ()
    {
        images = new HashMap<String, Image>();
        images.put( "contactPhoto", null);
        images.put( "companyPhoto", null);
    }

    public Set<String> getAllImages()
    {
        return images.keySet();
    }

    public static void main(String[] args)
    {
        System.out.println(new Contact().getAllImages());
    }
}

采用:

Field[] fields=this.getClass().getFields();
...
 for (...){
  if ( fields[i].getType() == ?? ){
  ...
  }
 }

暫無
暫無

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

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