Dynamiczne wczytywanie kodu z pliku

0

Witam,
mam pytanie, które mnie nurtuje.

Czy po napisaniu aplikacji w Javie istnieje możliwość, aby podczas pracy programu pobierał on za każdym zawartość pliku zewnętrznego przy wywołaniu utworzonej metody , a następnie interpretował to jako kod i wykonywał?

Dokładniej, chodzi mi o dynamiczne wprowadzanie kodu wykonywalnego do odpalonej aplikacji(wiem czym to grozi, ale ciekawość maniaka...).

To samo w odniesieniu do ruby i python, bo są to języki interpretowane, ale zastanawia mnie ich mechanika w porównaniu z PHP(wiem, że może dziwne porównanie, ale ucieszę się z fachowej odpowiedzi).

1

W pythonie masz funkcję wbudowaną exec(), której podaje się jako argument stringa z kodem ;) Masz też eval() dla wartości wyrażeń zapisanych w jednej linii.

Co do Javy: http://stackoverflow.com/questions/4842684/how-to-compile-run-java-program-in-another-java-program
Z tym, że to raczej nie do końca rozwiązanie, które Cię interesuje... Musiałbyś ze swoją aplikacją dostarczać jdk. Nie wiem, czy są lepsze metody. Chyba łatwiej język skryptowy podpiąć pod aplikację i w tym języku pisać dodatkowy kod
http://java-source.net/open-source/scripting-languages - masz kilka projektów pozwalających na takie rzeczy.

0

Dzięki za odpowiedź, postaram się bardziej fachowo opisać problem:
1)Mam jakąś klasę z metodami.
2)Po załadowaniu aplikacji tworzy się obiekt i mogę wywołać jego metody
3)w aplikacji jest okienko, które pozwala na dynamiczną modyfikację klasy
dopisanie metod, lub ich zmianę, usunięcie

Zerkam właśnie na programowanie aspektowe, ale jeszcze nie wiem, czy to jest to :-)

1

Groovy oferuje wykonanie kodu zapisanego w Stringu a jest w 100% kompatybilny z Javą. Zatem napisz to w Groovym :)

0

Mistrzu Java niech Ci w dzieciach wynagrodzi :-) Wielkie dzięki i hołd :-P

1

w aplikacji jest okienko, które pozwala na dynamiczną modyfikację klasy
dopisanie metod, lub ich zmianę, usunięcie

Poniższy kod przedstawia w jaki sposób możesz w Pythonie modyfikować klasę poprzez dopisanie nowej metody.

class Calculator(object):

    def __init__(self, a, b):
        self.a = a
        self.b = b

Calculator.add = lambda self: self.a + self.b

calculator = Calculator(10, 20)
print calculator.add()

Żeby usunąć metodę z klasy wystarczy użyć:

del Calculator.add

Poza takimi działaniami masz możliwość definiowania klas w czasie działania aplikacji. Wtedy możesz dobrać nazwę klasy, klasy po których dziedziczymy i wszystkie składowe (poczytaj o metaprogramowaniu) :)

Należy też wspomnieć, że poza możliwością modyfikowania klas masz również możliwość modyfikowania instancji.

0

Wow, proste :-)

1

Wielu miłych niespodzianek dostarcza wspomniana możliwość modyfikowania instancji.

class Osoba:
    def __init__(self,imie="no",nazwisko="name"):
       self.imie = imie
       self.nazwisko = nazwisko
    def show(self):
       print(self.imie+" "+self.nazwisko)

o = Osoba("Jan","Kowalski")
o.show()
Jan Kowalski
del o.imie
o.show()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in show
AttributeError: Osoba instance has no attribute 'imie'
1

Python pythonem, ale Groovy moze to samo:
Integer.metaClass.pisz = { println delegate }
i teraz
17.pisz()
i wypisze 17. Tak dodaje sie metody typu:
17.times { println it }
To samo w Ruby, i wielu innych nowoczesnych jezykach, rozwijanych jezykach.

Co znaczy ze Groovy jest w 100% kompatybilny z Java? Ze chodzi na JVM? Wtedy sie zgodze. Ze kod Groovy skompiluje sie z javac, albo kod Javy kompiluje sie z groovyc? W zadnym wypadku.

0
bogdans napisał(a):

Wielu miłych niespodzianek dostarcza wspomniana możliwość modyfikowania instancji.

class Osoba:
    def __init__(self,imie="no",nazwisko="name"):
       self.imie = imie
       self.nazwisko = nazwisko
    def show(self):
       print(self.imie+" "+self.nazwisko)

o = Osoba("Jan","Kowalski")
o.show()
Jan Kowalski
del o.imie
o.show()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in show
AttributeError: Osoba instance has no attribute 'imie'

No tak, ale zasadniczo to programista bierze odpowiedzialność za kod jaki pisze i musi brać pod uwagę różne przypadki.
Wiadomo, wszystko wychodzi w praniu.
Czy błąd powyższego typu w pythonie skutkuje natychmiastowym zakończeniem działania aplikacji, jeżeli byśmy zmodyfikowali jej klasę/instancję klasy dynamicznie podczas działania?

Pozwólcie, że napiszę dlaczego tak drążę ten temat. Mam kilkuletnie doświadczenie zawodowe programistyczne w Cpp( też innych technologiach, ale już raczej z ciekawości/uzależnienia). Otworzyłem firmę i zacząłem prowadzić szkolenia w zakresach, na które pozwalają mi moje kompetencje. Jednym z moich aktualnych planów jest rozpoczęcie szkolenia dla gamedeveloperów, gdzie osoby zainteresowane szkoleniem nie tylko zapoznają się z wybranym językiem programowania, ale jeżeli będą chętne, to będą mogły rozpocząć budować wspólny projekt, który będzie także ich współwłasnością.

Chciałbym także maksymalnie ograniczyć koszta takich osób za udział w szkoleniu (współcześnie dla niektórych wydatek 2000 zł za szkolenie to niestety duża suma).

Ideą projektu jest stworzenie prostej graficznie gry RTS, gdzie gracz zamiast sterować jednostkami, programuje dynamicznie ich AI. Od tego będą zależeć wynik potyczek pomiędzy graczami i to jak zachowa się dana jednostka na polu bitwy.

Do tego celu muszę dobrać odpowiednią technologię(czyli właściwy język programowania) i znaleźć odpowiedniego szkoleniowca do prowadzenia zajęć online(przynajmniej w odniesieniu do fundamentów języka, jeżeli nie miałem z nim większej styczności).

Jak na ten moment zainteresował mnie Python, ale nie wiem czy byłby na 100% dobrym wyborem, chociaż z drugiej strony słyszałem wiele dobrego o zaczynaniu nauki programowania od pythona.

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