Wpis z mikrobloga

Cały program pisany jest w Javie, tylko klasa zawierająca .main() to Groovy. Ewentualnie mogę stworzyć więcej klas Groovy na potrzeby rozwiązania poniższego problemu.

Potrzebuję korzystać z klas, które nie znajdują się w projekcie - póki co program uruchamiany jest w Eclipse, finalnie będzie też potrzeba rekompilacji klasy main i odpalania programu z CMD. Te klasy, które mają zostać doczytane to również Groovy, a ścieżki do nich MUSZĄ być zapisane jako zmienne/stałe w metodzie .main() programu. Bezpośrednio w tej metodzie również będą te doczytane klasy wykorzystywane.

Sam program jak i doczytywane klasy to oddzielne byty ale program musi te doczytane klasy przekompilować. Ba, wcześniej musi je nawet tymczasowo zmodyfikować (po zakończeniu działania programu klasa musi być identyczna jak przed uruchomieniem). Ten program ma za zadanie symulować działanie pewnej aplikacji, która (w uproszczeniu) korzysta z tych klas, które ja potrzebuję doczytać. W skrócie mój program ma służyć do testowania tychże klas poprzez pisanie kodu/testów w mojej metodzie .main(). Z tym, że w tych klasach brakuje niezbędnych pól. Nawet po dołączeniu takiej klasy do projektu, program wysypuje się w jej konstruktorze - No such property: X for class: Y
Normalnie w aplikacji konstruktor wywoływany jest tak samo. Nie wiem jak to jest zrobione, że uruchomiona aplikacja te brakujące pola widzi i obiekt tej klasy działa na nich. Trzeba jeszcze dodać, że te brakujące pola w oryginalnej aplikacji są innej klasy niż te, które ja próbuję przekazać do konstruktora (ale to nie z tego powodu się sypie - tych pól w klasie w ogóle nie ma). Te obiekty które przekazuję do konstruktora są mojej własnej klasy i mają za zadanie symulować działanie oryginalnych. Po dodaniu do klasy odpowiedniego pola które jest typu mojej klasy, program normalnie działa. Poniżej fragment z konstruktorem:
https://pastebin.com/aQRpFnYf

Nie wiem jak to rozwiązać. Mógłbym to nawet i zrobić "głupio", czyli pobrać zawartość z plików .groovy do Stringów i po chamsku do tych Stringów pododawać co trzeba. Tylko jak z tych Stringów później te klasy doczytać żebym mógł z nich korzystać tak jakby były częścią programu (tzn. tworzyć normalnie ich obiekty, korzystać z ich metod statycznych itd.) ?
Da się w ogóle coś takiego zrobić?

#java #groovy
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

  • 0
@TomaszWKS
Ze Stringa w runtime zrobić klasę i jej użyć?
1. Da się.
2. Chyba by mnie piorun musiał strzelić trzy razy z rzędu, żebym się na takie coś zgodził.
  • Odpowiedz
Ze Stringa w runtime zrobić klasę i jej użyć?

1. Da się.


@sorhu: Ale będzie się dało z niej korzystać tak samo jak gdyby istniała w bin? Czego mam szukać w dokumentacji? groovy.lang.GroovyClassLoader? Podpowiedz coś.
  • Odpowiedz
@sorhu: To jak mam pododawać pola do klasy w runtime i dołączyć ją do użycia? Później i tak będę musiał obsłużyć uruchamianie ze Stringa, żeby uruchamiać zapisane w XML skrypty.
  • Odpowiedz
  • 0
@TomaszWKS
Nie wiem jak. Wybacz, ale całe te wymagania "śmierdzą". Dlaczego w ogóle ktoś miałby chcieć zrobić coś tak dziwnego? Może pokaż jakiś szerszy kontekst. Być może da się to zrobić normalnie.
  • Odpowiedz
@sorhu: Kontekst jest taki, że nie ma wersji aplikacji, którą można by odpalić lokalnie by na niej pracować i testować przed wrzuceniem kodu na serwer testowy. Dlatego piszę program, który przynajmniej w części by to umożliwił symulując działanie tej aplikacji. To, że aplikacja działa w idiotyczny sposób i ma pozmienianą bibliotekę standardową Javy to już nie moja wina. Klasy, które potrzebuję doczytać to kod, który ma zostać przetestowany w moim
  • Odpowiedz
sprawdzałeś czy javowy ScriptEngine będzie w stanie kulturalnie łyknąć skrypt Groovy?


@ppawel: Kiedyś próbowałem kombinować ze ScriptEngine ale do niczego sensownego nie doszedłem. Jedyne co udało mi się przez to uruchomić to JS.
  • Odpowiedz