Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компиляция в Java-байт код "на лету"?! Tools? 
:(
    Опции темы
Killer_13
  Дата 23.2.2012, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



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

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

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

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

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

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

Спасибо!
PM MAIL   Вверх
dobrolub
Дата 23.2.2012, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



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


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

PM   Вверх
Killer_13
Дата 24.2.2012, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Цитата

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


потом вызывай функцию main(String []args) через рефлекцию.
Спасибо, не подскажете где можно посмотреть рабочий пример?
PM MAIL   Вверх
dobrolub
Дата 24.2.2012, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Код

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 секунд
Другая возможность, это генерация байткода. Это не так сложно как это звучит.
PM   Вверх
Killer_13
Дата 24.2.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



dobrolub - спасибо большое. На счет tools.jar я писал что мне начальство сказало - большой в мегабайтах...

Добавлено через 19 секунд
Остальные посмотрю..
PM MAIL   Вверх
LSD
Дата 24.2.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

Плюс посмотри ByteCode Libraries in Java.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Killer_13
Дата 24.2.2012, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



dobrolub
Цитата

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

Цитата

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


LSD

Цитата

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

Цитата

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

Это сообщение отредактировал(а) Killer_13 - 24.2.2012, 15:37
PM MAIL   Вверх
Killer_13
Дата 24.2.2012, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Цитата

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

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

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

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

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

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

спасибо! 
PM MAIL   Вверх
LSD
Дата 24.2.2012, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Killer_13
Дата 24.2.2012, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Тааакссс. пытаюсь состряпать рабочий пример для 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
Буду благодарен за подсказки..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.