2009-11-24 6 views
2

Я хочу пересмотреть старый вопрос о компиляции классов в памяти. Поскольку прошло около полутора лет с тех пор, как я попросил (и был несколько ответил), я хотел бы снова поднять вопрос и посмотреть, появится ли что-то новое (так что нет, я не считаю это дубликат) ,java in-memory on-the-fly класс компиляции (и загрузки)

Старый вопрос можно найти здесь: On-the-fly, in-memory java code compilation for Java 5 and Java 6 - Я предлагаю прочитать его (и ответы), прежде чем отвечать на этот вопрос.

Я вполне доволен beanshell, выполняющим тяжелую работу по оценке строки класса java до фактического объекта класса. Тем не менее, beanshell стоял на версии 2.0b4 целую вечность и его ограничения (без конструктора, даже не по умолчанию, никаких дженериков, нет для каждого, без перечислений ...) раздражают.

Напоминание - это должно использоваться как интерфейс отладки, поэтому соображения производительности незначительны. Тем не менее, я не могу перезагрузить сервер, не могу отправить файлы классов в место, и JSP - очень плохой выбор для меня (я не буду вдаваться в причины здесь). Кроме того, конечный продукт должен быть классом (или объектом этого класса), чтобы я мог его пропустить.

Некоторые ограничения: у меня не может быть JDK, поэтому нет javax.tools.JavaCompiler. Я не могу иметь JSP, так как у меня нет tomcat или другого «реального» веб-контейнера. Поддержка синтаксиса Java 5 будет отличной, особенно дженериками, перечислениями и параметризацией. Поддержка конструкторов по умолчанию будет очень приятной.

Любые идеи?

Редактировать 1: Я только что узнал, что существует круглый способ создания конструкторов в beanshell - однако вы должны объявить их «public void XXX() {...}« вместо обычного »public XXX() {...}».

ответ

0

Я закончил использование Bean Shell. Это не идеально, но он решил 99% проблемы.

0

Не можете ли вы просто скопировать на tools.jar и получить javax.tools.JavaCompiler и добавить его в путь к классам? Или это проблема лицензирования.

Этот код и tools.jar на пути к классам, кажется, работает:

import java.io.File; 
import java.io.IOException; 
import java.util.Arrays; 
import javax.tools.JavaCompiler; 
import javax.tools.JavaFileObject; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider; 


public class Main 
{ 
    public static void main(final String[] argv) 
     throws IOException 
    { 
     final File[]        files; 
     final JavaCompiler      compiler; 
     final StandardJavaFileManager   fileManager; 
     final Iterable<? extends JavaFileObject> compilationUnits; 

     files = new File[] 
     { 
      new File(argv[0]), 
     };   
     compiler   = ToolProvider.getSystemJavaCompiler(); 
     fileManager  = compiler.getStandardFileManager(null, null, null); 
     compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files)); 

     compiler.getTask(null, fileManager, null, null, null, compilationUnits).call(); 
     fileManager.close(); 
    } 
} 
+0

№ Вопрос лицензирования. Кроме того, клиент может изменить JRE, с которым работает мой сервер, так что это проблема совместимости. –

2

Если вы не можете связывайте tools.jar ВС JDK по причинам лицензирования, возможно, вы могли бы включать в себя Eclipse, JDT Основной компилятор вместо этого, см

http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm

Это, например, что делает реализация JSP веб-сервера Jetty.

+0

Поскольку я использую причал, я мог бы подумать об этом. хороший звонок. –

+0

Ну, да. Это потребует от меня: 1.напрямую зависят от JDT, что является проблемой для меня (уровень организации) или 2. зависит от внутренних элементов причала, которые не гарантируются, чтобы не измениться. Спасибо в любом случае –

0

Я помню, как долгое время назад я читал о Библиотеке инженерии байткодов (BCEL), когда Java 1.4 был в ярости. См. http://jakarta.apache.org/bcel/index.html. Я никогда не использовал его, поэтому я упоминаю только об этом, потому что он кажется близким к тому, о чем вы спрашиваете (и это работает, или, по крайней мере, работает, с более старыми VM), и я не видел, чтобы кто-то еще упоминал об этом.

+0

Посмотрите на него. Это не похоже на правильное решение - слишком много накладных расходов. –

0

Есть ли конкретная причина, почему это должна быть строка Java, которая производит класс/объект? Моя спонтанная реакция заключается в том, что JRuby - это то, что вы ищете - это, кажется, очень прочная платформа, и у Ruby есть сильная традиция метапрограммирования.

+0

Должна быть строкой Java, так как это знают все разработчики. Я хочу написать «плагин», который будет подключаться к работающему серверу и помогать его отладке (создавать сообщения журнала, внутренние запросы запросов и т. Д.). Принуждение каждого к изучению рубина сделало бы это устаревшим до того, как оно начнется (никто не узнает - никто не будет его использовать). –

+0

Как грустно - это подойдет вам, как перчатка. Причина в том, что Java обычно не используется для сценариев, как вы заметили. Я предполагаю, что Groovy и JavaScript (оба более Java-иш, чем Ruby) тоже не могут быть и речи? – gustafc

+0

@ gustafc: да, по тем же причинам. –

 Смежные вопросы

  • Нет связанных вопросов^_^