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...
Předmět Autor Datum
Proč do toho tahat reflexi? Snad přece víš, jaký má ten objekt fieldy.
Wikan 19.05.2019 06:10
Wikan
A proč ne? Vím, který fieldy chci, ale nechci je tam všechny vypisovat. Chtěl jsem zkusit něco nové…
MichalDM 19.05.2019 14:01
MichalDM
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
java.lang.reflect.Modifier.isStatic Reflexe v Jave neni pomala, ale proste pokud ji nemusis pouzit…
MaSo 19.05.2019 19:10
MaSo

A proč ne? Vím, který fieldy chci, ale nechci je tam všechny vypisovat.

Chtěl jsem zkusit něco nového. Ale, hlavně jsem to nechtěl psát strojově.

To this je tam zbytečné, ale nemůžu an to dojít

Cpe mi to všechno ohledně třídy, ale jak získám hodnota fieldu u daného objektu?

Navíc, potřeboval bych pouze non-static field.

Jak to, prosím Vás, udělám?

Děkuji

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...