Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Java - Jak získat všechny fields objektu jako String?

Dobrý den,

Mám třídu Example. Z ní vytvořím objekt.

Example example = new Example(4, 8, "four", "eight");

Jak napíšu metodu, která mi vrátí všechny fields jako ArrayList<String>

import java.lang.reflect.Field;
import java.util.ArrayList;

public class Example {

    int first, second;
    String third, fourth;

    public Example(int first, int second, String third, String fourth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
    }

    public ArrayList<String> getAllFields() {
        Field fields[] = this.getClass().getDeclaredFields();
        ArrayList<String> list = new ArrayList<>(fields.length);
        for (Field field : fields) {
            try {
                if (field.getGenericType().getTypeName().equals("int")) {        
                    
                } else {
                    
                }
            } catch (IllegalArgumentException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return list;
    }
}

V podmínce dokážu rozlišit datový typ. Pomocí field.getName() můžu zjistit jméno fieldu, ale mám problém ho dostat do pole respektive převést na String.

Prosím Vás o radu

Děkuji

PS. Pochopitelně jsem to zkoušel, ale nešlo mi to a psát tam špatný kód nebudu.

loading...
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Co třeba field.get(this).toString() A jinak je reflexe dost pomalá, takže když máš snadnou možnost,…
Wikan 19.05.2019 14:16
Wikan
Aha. Tak to mě nenapadlo. Trochu jsem to upravil import java.util.ArrayList; import java.util.Array…
MichalDM 19.05.2019 18:53
MichalDM
Přidej si tam podmínku ve smyslu: if (!Modifier.isStatic(field.getModifiers()) Při překladu kódu pr…
Wikan 19.05.2019 19:10
Wikan
OK. Díky. Chápu. Tohle je tedy finální kód import java.lang.reflect.Modifier; import java.util.Arra…
MichalDM 19.05.2019 23:43
MichalDM
Zde je kompaktnější metoda getAllFields() Odkaz poslední
MichalDM 23.05.2019 11:00
MichalDM

Aha. Tak to mě nenapadlo. Trochu jsem to upravil

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    int first, second;
    String third, fourth;
    static int fifth;

    public Example(int first, int second, String third, String fourth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
    }

    public ArrayList<String> getAllFields() {
        var fields = new ArrayList<>(Arrays.asList(getClass().getDeclaredFields()));
        var list = new ArrayList<String>(fields.size());
        fields.forEach((t) -> {
            try {
                list.add(t.get(this).toString());
            } catch (IllegalArgumentException | IllegalAccessException ex) {
                System.out.println(ex.getMessage());
            }
        });
        return list;
    }
}

Potřeboval bych vyfiltrovat static field (fifth). Jak to, prosím Vás, udělám?

Děkuji

PS. O reflexi jsem nikdy neslyšel. Proč by měla být pomalá?

Přidej si tam podmínku ve smyslu:
if (!Modifier.isStatic(field.getModifiers())

Při překladu kódu probíhá spousta kontrol - jestli má daná třída potřebný field či jestli je potřebného typu. U metod třeba jestli je volaná se správným počtem správných typů.
Jakmile použije reflexi, tak se všechny tyhle kontroly provádějí až za běhu, protože předem to prostě nejde zjistit.
Takze třeba vytáhnout si hodnotu fieldu pomocí reflexe je několikrát pomalejší, než ji vytáhnout přímo.

OK. Díky. Chápu. Tohle je tedy finální kód

import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    int first, second;
    String third, fourth;
    static int fifth;

    public Example(int first, int second, String third, String fourth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
    }

    public ArrayList<String> getAllFields() {
        var fields = new ArrayList<>(Arrays.asList(getClass().getDeclaredFields()));
        var list = new ArrayList<String>(fields.size());
        fields.stream().filter((f) -> !Modifier.isStatic(f.getModifiers())).forEach((f) -> {
            try {
                list.add(f.get(this).toString());
            } catch (IllegalArgumentException | IllegalAccessException ex) {
                System.out.println(ex.getMessage());
            }
        });
        return list;
    }
}

Zpět do poradny Odpovědět na původní otázku Nahoru

loading...