Czy da się oczytać nazwę(deklarację) zmiennej?

0

Piszę program w języku Java i mam taki problem, że bardzo przydała by mi się możliwość odczytu deklaracji zmiennej.

Jeśli mam zmienną i chce wykorzystać nazwę tej zmiennej w Stringu to robię tak:

int liczbaKsiążek = 100;
String someString = "liczbaKsiążek ma wartość: " + liczbaKsiążek;

natomiast chciałbym wykonywać coś takiego:

int liczbaKsiążek = 100;
String someString = getVariableName(liczbaKsiążek) + " ma wartość: " + liczbaKsiążek;

tak żeby przy ewentualnej zmianie nazwy tej zmiennej nie musieć zmieniać wszystkich Stringów?

0

Podaj konkretny przykład użycia - najprawdopodobniej robisz coś źle po drodze, przez co teraz kombinujesz z takimi dziwadłami jak odczytywanie nazwy zmiennej.

0

Potrzebuję zapisać wartości wielu zmiennych w pliku z logami i jeśli potrzebuję zmienić nazwę zmiennej to muszę zmieniać również Stringi w części kodu odpowiedzialnej za tworzenie logów.

0

No dobrze, to teraz weź pod uwagę taką sytuację.
Masz zmienną:

int liczbaKsiazek;

Gdzieś tam w kodzie wypisujesz sobie:

String msg = getVariableName(liczbaKsiazek) + " = " + liczbaKsiazek;

I teraz zmieniasz sobie nazwę zmiennej liczbaKsiazek na liczbaMoli. I co dzieje się dalej? Program się nie kompiluje, bo tam, gdzie tworzysz stringa już nie ma zmiennej o nazwie liczbaKsiazek. Więc i tak musisz tam pójść i zmienić. Chyba, że o to Ci właśnie chodzi, ale to trochę jakieś dzikie rozwiązanie.

0

Jeżeli mialbyś te zmienne zdefiniowane w klasie to dzieki Java Reflections mogłbyś wypisać np wszystkie zmienne z tej klasy z ich nazwami i wartościami w konkretnym obiekcie.

0
Juhas napisał(a):

No dobrze, to teraz weź pod uwagę taką sytuację.

I teraz zmieniasz sobie nazwę zmiennej liczbaKsiazek na liczbaMoli. I co dzieje się dalej? Program się nie kompiluje, bo tam, gdzie tworzysz stringa już nie ma zmiennej o nazwie liczbaKsiazek. Więc i tak musisz tam pójść i zmienić. Chyba, że o to Ci właśnie chodzi, ale to trochę jakieś dzikie rozwiązanie.

Nie muszę bo zmieniam przez Refaktor i wtedy zmienia mi wszystkie wystąpienia danej zmiennej.

0
TomDom napisał(a):
Juhas napisał(a):

No dobrze, to teraz weź pod uwagę taką sytuację.

I teraz zmieniasz sobie nazwę zmiennej liczbaKsiazek na liczbaMoli. I co dzieje się dalej? Program się nie kompiluje, bo tam, gdzie tworzysz stringa już nie ma zmiennej o nazwie liczbaKsiazek. Więc i tak musisz tam pójść i zmienić. Chyba, że o to Ci właśnie chodzi, ale to trochę jakieś dzikie rozwiązanie.

Nie muszę bo zmieniam przez Refaktor i wtedy zmienia mi wszystkie wystąpienia danej zmiennej.

Ale to jest już błędne założenie. Teraz zmieniasz przez refaktor, a za kilka miesięcy Ty (albo ktoś inny) zmieni ręcznie. Nie można polegać na tym, że wszyscy zawsze będą używali refaktora. Tak, jak poprzednik powiedział - użyj refleksji - wylistujesz sobie wszystkie zmienne i ich wartości.

1

Przyklad wykorzystania refleksji:


    class Log {
        String tag;
        int value;

        public Log(String tag, int value) {
            this.tag = tag;
            this.value = value;
        }
    }

    public static void main(String[] args) {

        Log log = new Log("Test 1", 3);
        displayFields(log);
    }

    public static void displayFields(Object object)  {
        Class<?> aClass = object.getClass();
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            Object value = field.get(object);
            System.out.println("Field: " + field.getName() + " = " + value);
        }
    }

A konsola wyswietli stan obiektu:

 
Field: tag = Test 1
Field: value = 3

Zamiast wyswietlać w konsoli, mozesz wypisac to do pliku z logami. Nazwy pól w logach zawsze bedą sie zgadzały z tymi z klasy, nawet po zmianie ich nazwy (w kodzie źródłowym).

0
Juhas napisał(a):

Ale to jest już błędne założenie. Teraz zmieniasz przez refaktor, a za kilka miesięcy Ty (albo ktoś inny) zmieni ręcznie. Nie można polegać na tym, że wszyscy zawsze będą używali refaktora. Tak, jak poprzednik powiedział - użyj refleksji - wylistujesz sobie wszystkie zmienne i ich wartości.

Nie miałem doświadczenia z refleksją, zaraz poczytam o niej.

Tylko nie rozumiem dlaczego nazwy zmiennej powinno zmieniać się ręcznie jeśli którąkolwiek pominę cały kod może się wysypać?

0

Pobawiłem się trochę informacjami od Hagefid i doszedłem do takich wniosków przedstawionych w przykładzie



import java.lang.reflect.Field;

public class SomeClass {

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
        new SomeClass().start();
    }


    int liczbaKsiazek = 100;
    int iloscDniWypozyczenia = 20;

    void start() throws IllegalArgumentException, IllegalAccessException {

        String nazwaPierwszejZmiennej;


// jeśli chemy odczytać nazwę zmiennej danej klasy to wystarczy uzyc this i następnych poleceń
     
       nazwaPierwszejZmiennej = this.getClass().getDeclaredFields()[0].getName();



// jesli dotyczy innej klasy to tworzymy obiekt z którego pobieramy klase itd

        SomeClass obj = new SomeClass();
        nazwaPierwszejZmiennej = obj.getClass().getDeclaredFields()[0].getName();



// to samo co w przykładzie drugim tylko bez deklarowania obiektu

        nazwaPierwszejZmiennej = new SomeClass().getClass().getDeclaredFields()[0].getName();




        String nazwaDrugiejZmiennej;
        nazwaDrugiejZmiennej = this.getClass().getDeclaredFields()[1].getName();


        System.out.println(nazwaPierwszejZmiennej);
        System.out.println(nazwaDrugiejZmiennej);

    }

}


1 użytkowników online, w tym zalogowanych: 0, gości: 1