"Advanced evaluating" dla Java

0

Witam,
poczytałem o Java SE 6 Compiler API i mam pytanie do was o inne rozwiązania tego typu tzn. czy jest w tym obszarze coś szczególnie wartego uwagi sprawdzonego.
W c# pisałem np. definicję statycznej klasy i metody w pliku zewnętrznym, i po wczytaniu do evaluatora mogłem ją wywołać z parametrami, którymi były obiekty moich klas.
Czy da się analogicznie w Javie?

0

Co chcesz ogólnie osiągnąć?

Jesli chcesz prosto odpalać skrypty na JVM to poczytaj np o języku Groovy: http://groovy.codehaus.org/ Wystarczy dodać JARka do projektu i może to latać nawet na JRE (tzn bez kompilatora javac).
Inną opcją jest np dodanie jakiegoś kompilatora Javy do projektu (np kompilator Eclipse) albo użycie jeszcze innego języka opartego o JVM, jak np Scala.

Java Compiler API wymaga aby zainstalowane było JDK na komputerze na którym to API jest odpalane.

0

Tak jak naisał @Wibowit popatrz na grooviego, albo na jythona na przykład.

0

Projekt już jest (na jboss as7) i zmiana technologi raczej nie jest możliwa (o ile dobrze zrozumiałem)
znam beanshella, na których trochę robiłem, ale nie próbowałem go używać w aplikacji
czy w przypadku groovy chodziło o to:
Poradzi sobie z obiektami moich klas jako parametry, których definicji nie dostanie do evaluowania?
[code]

//require(jar:'groovy-engine.jar')
// or include any version of groovy 1.7.10 or above in your pom file
private static void groovyEval()
{
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");

if(null==engine)
{
    System.err.println("Could not find groovy script engine,make sure to include groovy engine in your classpath");
}
try
{
    // basic groovy expression example
    System.out.println(engine.eval("(1..10).sum()"));

    // example showing scripting with variables (object method invoking)
    engine.put("first", "HELLO");
    engine.put("second", "world");
    System.out.println(engine.eval("first.toLowerCase() + second.toUpperCase()"));

    //example with boolean expression
    engine.put("m", 3);
    engine.put("n", 9);
    System.out.println(engine.eval("m<n"));

    //example with variable object and object member access:
    Position pos = new Position(100, 200);
    engine.put("p", pos);
    System.out.println(engine.eval("p.y-p.x>0"));
}
catch (ScriptException e)
{
    e.printStackTrace();
}

}
[/code]

0

W Javie jest coś takiego, jak ScriptEngine: http://docs.oracle.com/javase/6/docs/api/javax/script/ScriptEngine.html
Pozwala np. na uruchamianie skryptów Java i/lub JavaScript.

0

Projekt już jest (na jboss as7) i zmiana technologi raczej nie jest możliwa (o ile dobrze zrozumiałem)

Zarówno Groovy jak i Scala dobrze współpracują z Javą, więc nie musisz zmieniać technologii, tylko sam język skryptów. Groovy jest prawie że rozszerzeniem Javy (pewne niekompatybilności są ZTCP), natomiast Scala ma dość odmienną składnię.

Generalnie do Grooviego czy Scali możesz wrzucać bez problemu obiekty Javowe. Ze zwracanymi obiektami może (czasem) być ciężej jeżeli będziesz próbował zwracać obiekty klas Grooviego czy Scali. Jeśli będziesz zwracał obiekty klas Javowych (lub typy prymitywne) to nie będzie żadnego problemu. Np klasa String to klasa czysto Javowa więc Stringi możesz przesyłać bez problemu w obie strony.

0

A kolekcję encji? dao? te wstrzyknięcia będą potrzebne do trochę bardziej zaawansowanych rzeczy niż przesyłanie prymitywów - bardziej zbiory danych, praca z encjami (via hibernate)

0

Powinno działać. Spróbuj :)

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