string str = "public class c { // описание методов и свойств}";
требуется создать экземпляр этого класса и использовать его. на дот.нете такое делается нараз, а погуглил насчет джавы — приходится извращаться:
1) создать файл куда поместить данную строку;
2) вызвать компилятор
3) загрузить класс через ClassLoader
и только уже потом инстансировать и использовать.
без манипуляций с дисковыми операциями никак не обойтись? может все же возможно также как в шарпе?
Здравствуйте, aios, Вы писали:
A>без манипуляций с дисковыми операциями никак не обойтись? может все же возможно также как в шарпе?
Без библиотек пока никак.
java.lang.NullPointerException
at org.patrodyne.scripting.java.JavaCompiler.getStandardFileManager(JavaCompiler.java:61)
at org.patrodyne.scripting.java.JavaCompiler.compile(JavaCompiler.java:124)
at org.patrodyne.scripting.java.JavaCodeScriptEngine.parse(JavaCodeScriptEngine.java:161)
at org.patrodyne.scripting.java.JavaCodeScriptEngine.eval(JavaCodeScriptEngine.java:126)
at javax.script.AbstractScriptEngine.eval(Unknown Source)
at org.jxls.demo.reader.XlsReaderDemo.Test(XlsReaderDemo.java:60)
at org.jxls.demo.reader.XlsReaderDemo.main(XlsReaderDemo.java:49)
может тоже не предназначено для восьмой джавы?
vsb>Вариант 3 (то, что ты описал, но без работы с диском, требует com.google.jimfs:jimfs:1.1):
че-то не смог библиотеку подключить. может она только для 10й Java?
vsb>Эти примеры из этой темы.
Здравствуйте, aios, Вы писали:
A>а этот на выделенном фрагменте падает:
Надо запускать через JDK, в JRE нет поддержки Java Compiler API.
vsb>>Вариант 3 (то, что ты описал, но без работы с диском, требует com.google.jimfs:jimfs:1.1):
A>че-то не смог библиотеку подключить. может она только для 10й Java?
Нет, она 7+. Скорей всего то же самое, надо запускать через JDK.
B>А что за исходная задача? А то может выяснится, что в Яве исходная задача решается проще.
кстати да. лучше рассказать, а то может и правда фигней хочу страдать.
в общем один чел на одном крупном авиамоторостроительном предприятии в течение примерно 15 лет или около того писал что-то а-ля 1с планировал (правда у 1с архитектура совсем иная — одна сущность — одна таблица, здесь же реалиационная модель (если можно так выразиться) реализуется логически, на базе ряда таблиц. т.е. куча бизнес объектов, куча бизнес процессов все это упаковано в несколько таблиц грубо говоря. на шарепойнте вроде что-то подобное (очень мало с ним знаком, но он в отличие от этой системы работает и вроде бы даже местами неплохо). самое смешное все данные хранятся в текстовом виде, разделение типов тоже логическое. додумались на эту систему посадить производство. а это несколько тысяч записей в сутки. сначала все шло просто прекрасно. быстро. посадил теток из отдела эксплуатации клепать новые бизнес процессы и благополучно свинтил. веб-часть кстати реализована на викетах. помнишь что это такое? )))) вот такое подкинули мне. когда количество данных перевалило за миллионы записей пользователи начали задумываться. а какого вот хрена интересно у них документ открывается в течение полуминуты, когда погода располагает, а так — 1.5 — 2. ну и понеслась (это еще до моего прихода). надо оптимизировать. а чего там вообще можно соптимизировать, кроме как на корню переписать все нахрен пока еще не совсем полная жопа. что можно оптимизировать при такой архитектуре. когда изучал систему, видел там некоторые осторожные костыли (ну типа ID бизнес объекта стали хранить не в логическом текстовом поле, а физическое приалтерили и проиндексировали — поржал, но пользователи не хотят искать сволочи по айдишнику, они хотят почему захотят все атрибуты в физический слой не переведешь — уже не "1с" получится а вообще непонятный монстр.) ну это так преамбула.
по конкретной задаче. хотят на производстве отчет выгружать за год, а получается за 10 дней например. либо таймаут оракловый, либо 65536 строк в эксел (причем по непонятной мне причине они в poi (библиотека для эксел) использовали даже не xls, а xlt формат. для всех оставшихся в отделе это тайна покрытая мраком зачем.
ну в общем подключил новую версию poi. перевел на xlsx. ограничений теперь можно сказать. но оракловые таймауты иногда правда, но начальство сказала — эт фигня. главное чтобы эксел работал. тем более в новой версии ввели набор классов для быстрой работы с xlsx. на память уже не помню cxssf* вроде. зашибись. скорости достаточные. но блин встрял на том, что многих классов используемых в коде (а переписывать зачисто не хочу — сделать и забыть как страшный сон) нету. в частности для работы со шрифтами. я даже вникать не стал. но самое хреновое, что при существующем функционале, необходимо писать данные не только аппендом, но и править сверху очень активно. и так просто в это не вписаться.
в итоге взгляд остановился на надстройке над poi http://jxls.sourceforge.net/ решил, что использование шаблонов с ней будет самое оно с наименьшими трудозатратами.
теперь зачем хочу reflection. в этой библиотеке понравилось, что задаешь шаблон в экселе, рисуешь как тебе надо, описываешь по класс.поле что куда пихать в какие блоки и вуаля. причем работает очень быстро.
в коде надо описать класс, ну как в их примере, например:
public class Person {
String name;
геттеры-сеттеры
}
public class Department {
String name;
List<Person> person;
геттеры-сеттеры
}
потом проинстансировав объект скажем департмент, заполнив его данными, и натравив эту библиотеку на него, она сделает все за тебя, типа где какие персон работают например.
в той системе может быть потенциально (хоть и не используется) любая вложенность подчиненности или просто последовательных блоков. причем достаются они через огромную задницу, что естественно в данном случае.
вот и мне хочется организовать класс такой структуры, чтобы скормить его этой библиотеке. при этом не пришлось бы все переписывать на корню. может подскажете более простое решение.
Вместо генерирования бинов, можно просто подложить мэпы значений (dictionary в .net)
Если jxls тупой и не сможет брать значения в виде "person.name", то писать "person.get('name')". Хотя мне опять же кажется, что мэпы он должен из коробки поддерживать
Здравствуйте, bzig, Вы писали:
B>Вместо генерирования бинов, можно просто подложить мэпы значений (dictionary в .net)
B>Если jxls тупой и не сможет брать значения в виде "person.name", то писать "person.get('name')". Хотя мне опять же кажется, что мэпы он должен из коробки поддерживать
так он примерно так и делает http://jxls.sourceforge.net/getting_started.html (на скрине сразу поймешь — читать даже не надо). только толку-то? я заранее не знаю какой отчет они (тетки, которые отчетами занимаются на уровне пользователя) замутят, состав колонок и иерархию. поэтому заранее не подготовишь.
Здравствуйте, bzig, Вы писали:
B>Вместо генерирования бинов, можно просто подложить мэпы значений (dictionary в .net)
B>Если jxls тупой и не сможет брать значения в виде "person.name", то писать "person.get('name')". Хотя мне опять же кажется, что мэпы он должен из коробки поддерживать
A>так он примерно так и делает http://jxls.sourceforge.net/getting_started.html (на скрине сразу поймешь — читать даже не надо). только толку-то? я заранее не знаю какой отчет они (тетки, которые отчетами занимаются на уровне пользователя) замутят, состав колонок и иерархию. поэтому заранее не подготовишь.
???
Вместо генерации классов, генерируй мэпы (А то может они у тебя вообще уже сгенерированы, веди как-то ты данные из БД достаёшь).
Здравствуйте, bzig, Вы писали:
B>>Если jxls тупой и не сможет брать значения в виде "person.name", то писать "person.get('name')". Хотя мне опять же кажется, что мэпы он должен из коробки поддерживать
B>Хотя он JEXL использает, а тот из мэпа не позволяет доставить через ".key" http://commons.apache.org/proper/commons-jexl/reference/syntax.html B>Нужно писать "map['key']" или в твоём случае "person['name']"
Там можно и другой движок для выражений прикрутить. Спринговый может через точку.
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, aios, Вы писали:
A>>а этот на выделенном фрагменте падает:
vsb>Надо запускать через JDK, в JRE нет поддержки Java Compiler API.
действительно помогло. теперь другая проблема. public класс по ходу таким способом (под пунктом 2) не создашь? я попробовал — ругнулся, что файл должен быть для паблика.
Здравствуйте, aios, Вы писали:
A>Здравствуйте, vsb, Вы писали:
vsb>>Здравствуйте, aios, Вы писали:
A>>>а этот на выделенном фрагменте падает:
vsb>>Надо запускать через JDK, в JRE нет поддержки Java Compiler API.
A>действительно помогло. теперь другая проблема. public класс по ходу таким способом (под пунктом 2) не создашь? я попробовал — ругнулся, что файл должен быть для паблика.
Не скажу, не копался подробно. Может быть что-то настроить надо.