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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли откомпилировать Java код из программы, сори, если уже задавалось 
V
    Опции темы
anonymouse
Дата 27.12.2004, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хочу автоматически генерить Java код и компилярить его чтоб потом загрузить и использовать.
По моему где то я такое видел, но не помню где и как. Может SWT умеет ?
P.S. exec("javac") не предлагать.
--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 27.12.2004, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



com.sun.tools.javac.Main.compile


--------------------

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


Бывалый
*


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

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



быстро smile


спасибо
--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 27.12.2004, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



не за що smile
Добавлено @ 19:22
Можно здесь еще посмотреть:
http://www.javaworld.com/javatips/jw-javatip131.html


--------------------

PM   Вверх
anonymouse
Дата 27.12.2004, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




компилирую класс с помощью Main.compile, создается новый class-файл.
Загружаю его через Class.forName и создаю новую инстанцию.
Все работает.
Проблема: если изменить исходный код, и скампилировать его заного, то, сюдя по всему, ClassLoader не хочет его загружать повторно, и новая инстанция создается по старому коду.
Можно ли както перегрузить класс в текущей виртуальной машине, или придется какждый раз придумывать новое имя классу ?



--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 27.12.2004, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Придется делать либо так как ты делаешь, либо создавать новый ClassLoader.


--------------------

PM   Вверх
anonymouse
Дата 28.12.2004, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А если создавать свой ClassLoader, то каким макаром мне перегружать классы ?
--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 28.12.2004, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Делать все так же как и ранее, просто он "не будет знать" об уже созданных классах.


--------------------

PM   Вверх
anonymouse
Дата 28.12.2004, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Как то не получается, все закрыто в классе ClassLoader. Может у тебя конкретное решение есть ?
--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 28.12.2004, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Ну что-то типа
Код

   URL[] urls = null;
   try {
       File dir = new File(System.getProperty("user.dir")
           +File.separator+"dir"+File.separator);
       URL url = dir.toURL();      
       urls = new URL[]{url};
   } catch (MalformedURLException e) {
   }
   
   try {
       ClassLoader cl = new URLClassLoader(urls);
       Class cls = cl.loadClass("MyClass");
   
       // Create a new instance of the new class
       myObj = (MyClass)cls.newInstance();
   } catch (IllegalAccessException e) {
   } catch (InstantiationException e) {
   } catch (ClassNotFoundException e) {
   }



--------------------

PM   Вверх
anonymouse
Дата 28.12.2004, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



именно так и не будет работать. Он ставит один раз линк имя-bytecode. Т.е. если один раз загрузил класс, то в следующий раз (даже если class-файл изменился) он его грузить не будет, а возьмет старый.
попробую написать маленький пример чтоб все понятно было.
--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 28.12.2004, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(anonymouse @ 28.12.2004, 12:05)
именно так и не будет работать.


но ведь нужно создавать новый класс лоадер


--------------------

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


Бывалый
*


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

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



Код

/*
* Created on 28.12.2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package ws.tools.grep.model;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;

import com.sun.tools.javac.Main;

/**
* @author Name
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class test {
public static void main(String[] args) {
 new test().run();
}

public class MyClassLoader extends ClassLoader {
}

public String generateJavaClass0() {
 StringBuffer sb = new StringBuffer();
 sb.append("public class C1 {\n");
 sb.append("public static void start() {\n");
 sb.append("System.out.println(\"0\");\n");
 sb.append("}\n}");
 return sb.toString();
}

public String generateJavaClass1() {
 StringBuffer sb = new StringBuffer();
 sb.append("public class C1 {\n");
 sb.append("public static void start() {\n");
 sb.append("System.out.println(\"1\");\n");
 sb.append("}\n}");
 return sb.toString();
}

public void run() {
 try {
  // 0
  saveFile("C1.java", generateJavaClass0());
  Main.compile(new String[] { "C1.java" });
  Class cls = new MyClassLoader().loadClass("C1");
  cls.getMethod("start", null).invoke(null, null);
  // 1
  saveFile("C1.java", generateJavaClass0());
  Main.compile(new String[] { "C1.java" });
  cls = new MyClassLoader().loadClass("C1");
  cls.getMethod("start", null).invoke(null, null);
 } catch (Exception e) {
  e.printStackTrace();
 }
}

public void saveFile(String filename, String text) throws IOException {
 BufferedWriter out = new BufferedWriter(new FileWriter(filename));
 try {
  out.write(text);
 } finally {
  out.flush();
  out.close();
 }
}
}


вот..
может я чего не догоняю ?
Добавлено @ 21:22
пардон ошибся
вот такой код:

Код

/*
* Created on 28.12.2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package ws.tools.grep.model;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;

import com.sun.tools.javac.Main;

/**
* @author Name
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class test {
public static void main(String[] args) {
 new test().run();
}

public class MyClassLoader extends ClassLoader {
}

public String generateJavaClass0() {
 StringBuffer sb = new StringBuffer();
 sb.append("public class C1 {\n");
 sb.append("public static void start() {\n");
 sb.append("System.out.println(\"0\");\n");
 sb.append("}\n}");
 return sb.toString();
}

public String generateJavaClass1() {
 StringBuffer sb = new StringBuffer();
 sb.append("public class C1 {\n");
 sb.append("public static void start() {\n");
 sb.append("System.out.println(\"1\");\n");
 sb.append("}\n}");
 return sb.toString();
}

public void run() {
 try {
  // 0
  saveFile("C1.java", generateJavaClass0());
  Main.compile(new String[] { "C1.java" });
  Class cls = new MyClassLoader().loadClass("C1");
  cls.getMethod("start", null).invoke(null, null);
  // 1
  saveFile("C1.java", generateJavaClass1());
  Main.compile(new String[] { "C1.java" });
  cls = new MyClassLoader().loadClass("C1");
  cls.getMethod("start", null).invoke(null, null);
 } catch (Exception e) {
  e.printStackTrace();
 }
}

public void saveFile(String filename, String text) throws IOException {
 BufferedWriter out = new BufferedWriter(new FileWriter(filename));
 try {
  out.write(text);
 } finally {
  out.flush();
  out.close();
 }
}
}

--------------------
Много чего интересного...
PM MAIL   Вверх
Domestic Cat
Дата 28.12.2004, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



завтра буду на работе - посмотрю.


--------------------

PM   Вверх
Domestic Cat
Дата 29.12.2004, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Вот так работает:
Код


/*
* Created on 28.12.2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.net.*;
import java.io.*;
import com.sun.tools.javac.Main;

/**
* @author Name
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class test {
   public static void main(String[] args) {
 new test().run();
   }

   public String generateJavaClass0() {
 StringBuffer sb = new StringBuffer();
 sb.append("public class C1 {\n");
 sb.append("public static void start() {\n");
 sb.append("System.out.println(\"0\");\n");
 sb.append("}\n}");
 return sb.toString();
   }

   public String generateJavaClass1() {
 StringBuffer sb = new StringBuffer();
 sb.append("public class C1 {\n");
 sb.append("public static void start() {\n");
 sb.append("System.out.println(\"1\");\n");
 sb.append("}\n}");
 return sb.toString();
   }

   public void run() {
 try {
   // 0
   URL[] urls = null;
   File dir = new File(".");
   URL u = dir.toURL();
   urls = new URL[] {u};
   ClassLoader cl = URLClassLoader.newInstance(urls, null);
   saveFile("C1.java", generateJavaClass0());
   Main.compile(new String[] { "C1.java" });
   Class cls = cl.loadClass("C1");
   cls.getMethod("start", null).invoke(null, null);
   // 1
   cl = null;
   System.gc();
   cl = URLClassLoader.newInstance(urls, null);
   saveFile("C1.java", generateJavaClass1());
   Main.compile(new String[] { "C1.java" });
   cls = cl.loadClass("C1");
   cls.getMethod("start", null).invoke(null, null);
 } catch (Exception e) {
   e.printStackTrace();
 }
   }

   public void saveFile(String filename, String text) throws IOException {
 BufferedWriter out = new BufferedWriter(new FileWriter(filename));
 try {
   out.write(text);
 } finally {
   out.flush();
   out.close();
 }
   }
}

Но по-моему, так медленнее smile


--------------------

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

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

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


 




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


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

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