Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Компиляция в Java-байт код "на лету"?! Tools?


Автор: Killer_13 23.2.2012, 21:29
Вопрос очевиден из названия теммы.
Нужна утилита(технология), не знаю как правильно назвать, которая компилирует Java-код в Java-байт-код "НА ЛЕТУ".

Нашел менее более подходяший инструмент http://docs.codehaus.org/display/JANINO/Home

Еще похожую фишку предлагает javax.tools но tools.jar оч большой по размеру и там сидит много фишек которые используются оч редко

Сейчас данную задачу делает "Bean Shell"! Как сказало начальство - он медленный - ищи альтернативу. smile

Кто сталкивался с похожей задачей? Подскажите альтернативы, ресурсы где можно почитать на эту тему... Даже не знаю как правильно подать запрос в гугле на эту тему.

Буду рад любым соображениям, предложениям, замечаниям, мыслям на эту тему!

Спасибо!

Автор: dobrolub 23.2.2012, 23:33
Class.forName("com.sun.tools.javac.Main", false, classloader);


потом вызывай функцию main(String []args) через рефлекцию.

Автор: Killer_13 24.2.2012, 01:08
Цитата

Class.forName("com.sun.tools.javac.Main", false, classloader);


потом вызывай функцию main(String []args) через рефлекцию.
Спасибо, не подскажете где можно посмотреть рабочий пример?

Автор: dobrolub 24.2.2012, 02:12
Код

package tmp;

import java.io.*;
import java.lang.reflect.*;

public class T {
    public static void main(String []args) throws Exception {
        Class c = Class.forName("com.sun.tools.javac.Main");
        Method method = c.getMethod("main", new Class[]{String[].class});
        method.invoke(null, new Object[]{args});
    }
}



Есть ещё java-assist (now a jboss project), eclipse compiler. Эти альтернативы, на мой взгляд,  проигрывают использованию родного компилятора из JDK.

Он в tools.jar , но другие компиляторы тоже в jarиках. А этот уже на машине, и, возможно уже загружен другими библиотеками.

Добавлено через 39 секунд
Другая возможность, это генерация байткода. Это не так сложно как это звучит.

Автор: Killer_13 24.2.2012, 11:04
dobrolub - спасибо большое. На счет tools.jar я писал что мне начальство сказало - большой в мегабайтах...

Добавлено через 19 секунд
Остальные посмотрю..

Автор: LSD 24.2.2012, 14:47
В JDK 6 появился стандартный класс http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html для доступа к компилятору.

Плюс посмотри http://java-source.net/open-source/bytecode-libraries.

Автор: Killer_13 24.2.2012, 15:37
dobrolub
Цитата

eclipse compiler.
 не смог определить точность нахождения инфы. подкиньте ссылку

Цитата

Другая возможность, это генерация байткода. Это не так сложно как это звучит. 
 - что вы имеете ввиду? Я вот только начинаю вникать что это и с чем его кушать..


LSD

Цитата

В JDK 6 появился стандартный класс JavaCompiler для доступа к компилятору.
 - пасиб, посмотрю

Цитата

Плюс посмотри ByteCode Libraries in Java. 
 - да, нашел парочку..

Автор: Killer_13 24.2.2012, 15:58
Цитата

В JDK 6 появился стандартный класс JavaCompiler для доступа к компилятору.
 - посмотрел, по ходу этот класс из tools.jar... Или я ошибаюсь?

только что поговорил с начальником, понимание для чего это нужно обретает четкий характер. smile

Значит нужен инструмент для компиляции "на лету" классов у которых есть зависимости в .class-файлах зупещенного приложения!

НЕ для компиляции кусочков кода, НЕ для зависимости компилируемых "на-лету" классов из какой то другой библиотеки. 

Буду копать в сторону Javassist потом Janino потом tools.jar(как самый последний вариант).

Скажите пож Javassist может компилировать калссы "на лету"?

спасибо! 

Автор: LSD 24.2.2012, 18:33
Цитата(Killer_13 @  24.2.2012,  16:58 Найти цитируемый пост)
- посмотрел, по ходу этот класс из tools.jar... Или я ошибаюсь?

Это публичный API к компилятору, а внутри он использует tools.jar. Просто использовать не публичный API при наличии публичного, не очень хорошо.

Автор: Killer_13 24.2.2012, 18:36
Тааакссс. пытаюсь состряпать рабочий пример для Javassist, и что-то себе слабо представляю как это слепить.
может, кто работал - подскажет?

Значит для начала все елементарно.
Есть 
Код
public class JssistMain {

    public static void main(String[] args) {
        One o = new One("1");
    }
}


Потом есть еще 2 класа, Хочу сделать следующее. Клас "One" грузится JVM.
Код
public class One {

    private String one = "ONE!";

    public One(String one) {
        this.setOne(one);
    }

    public String getOne() {
        return one;
    }

    public void setOne(String one) {
        this.one = one;
    }
}


Клас "Two" грузится Javassist. При этом по ходу должен тянуть клас "One" из скомпилированных файлов .class
Код
public class Two {

    private String two = "TWO!";
    private One oneExemplar = new One("oneExemplar");

    public Two(String two) {
        this.two = two;
    }

    public String getTwo() {
        return two;
    }

    public void setTwo(String two) {
        this.two = two;
    }
}


Я правильно понимаю сию арифметику? Как слепить не знаю.. Читал офф туториал, пока глухо, нужно наверное еще пару раз перечитать.. smile
Буду благодарен за подсказки..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)