с динамическим созданием класса разобрался. в связи с чем возникло еще пара вопросов:
1) допустим следующий класс создан через рефлексию:
public class C<T>
{
public void foo(T param)
{
......
}
}
как инстансировать и работать с этим классом скажем для T = String. в инете че-то внятного ничего нет...
в принципе я не побрезгую строковыми операциями по замене перед компиляцией, но все же?
2) допустим я создал рефлексией класс из пункта 1. можно ли как-то динамически туда добавлять методы и поля?
блин. после .net как руки отрубили.... (при этом это там требовалось ну крайне редко....)
Здравствуйте, aios, Вы писали:
A>с динамическим созданием класса разобрался. в связи с чем возникло еще пара вопросов:
A>1) допустим следующий класс создан через рефлексию:
Класс создаётся не через рефлексию, а через кодогенерацию...
A>как инстансировать и работать с этим классом скажем для T = String. в инете че-то внятного ничего нет...
type erasure, в рантайме типов у генериков нет. Кодогенерировать с генериками смысла по-моему вообще нет.. Генери просто
public class C
{
public void foo(Object param)
}
Эффект тот же.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
A>>1) допустим следующий класс создан через рефлексию: ·>Класс создаётся не через рефлексию, а через кодогенерацию...
ну да. согласен. но работаю я потом с ним через рефлексию.
A>>как инстансировать и работать с этим классом скажем для T = String. в инете че-то внятного ничего нет... ·>type erasure, в рантайме типов у генериков нет. Кодогенерировать с генериками смысла по-моему вообще нет.. Генери просто ·>
·>public class C
·>{
·> public void foo(Object param)
·>}
·>
·>Эффект тот же.
да не подходит мне этот эффект. фишка в том, что я даже как зваться класс не знаю. знаю что там будет набор атрибутов (в зависимости от настроек отчета). кроме того неограниченная вложенность блоков, куда опять-таки входят всякие атрибуты и блоки и т.д. вложенность в общем случае любая и все это надо скормить библиотеке для формирования файла эксел по шаблону. в общем фиг знает как без динамики выкрутиться.
Здравствуйте, aios, Вы писали:
A>·>Эффект тот же. A>да не подходит мне этот эффект. фишка в том, что я даже как зваться класс не знаю. знаю что там будет набор атрибутов (в зависимости от настроек отчета). кроме того неограниченная вложенность блоков, куда опять-таки входят всякие атрибуты и блоки и т.д. вложенность в общем случае любая и все это надо скормить библиотеке для формирования файла эксел по шаблону. в общем фиг знает как без динамики выкрутиться.
Не понял. Вопрос в том — накой тебе генерить класс с генериками?
Да и вообще по-моему ты что-то не то делаешь. Не надо классы генерить, а положить всё в Map<String,Value> и заставить jxls это использовать.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, aios, Вы писали:
A>с динамическим созданием класса разобрался. в связи с чем возникло еще пара вопросов:
A>1) допустим следующий класс создан через рефлексию:
A>
A>public class C<T>
A>{
A> public void foo(T param)
A> {
A> ......
A> }
A>}
A>
A>как инстансировать и работать с этим классом скажем для T = String. в инете че-то внятного ничего нет...
В рантайме T убирается. Поэтому в создании объекта оно никак не используется. C.class.newInstance() — так создаётся.
A>2) допустим я создал рефлексией класс из пункта 1. можно ли как-то динамически туда добавлять методы и поля?
·>Да и вообще по-моему ты что-то не то делаешь. Не надо классы генерить, а положить всё в Map<String,Value> и заставить jxls это использовать.
·>Да и вообще по-моему ты что-то не то делаешь. Не надо классы генерить, а положить всё в Map<String,Value> и заставить jxls это использовать.
может и не то. ну вот пример иллюстрирующий немного проблему:
class root // это не синтаксис явы, но хз как еще пояснить
{
A1 attr1;
A2 attr2;
.....
AN attrN;
List <Block0> block0;
List <Block1> block1;
.......
List <BlockN> blockN;
}
class Block0
{
B1 attr1;
B2 attr2;
.....
BN attrN;
List <BlockN+1> block0;
List <BlockN+2> block1;
.......
List <BlockN+k> blockNк;
}
......
и т.д.
вложенность потенциально любая, на практике — 2.
но пользователи хотят больше.
и все это хочу скормить библиотеке. убедился — вложенность поддерживает хорошо.
пока кроме динамической генерации ничего в голову не приходит.
п.с. яву знаю на уровне "знаю C#"
п.п.с. по уму, надо бы переписывать их систему составления sql запросов. но блин там такой лес.... и чуть ошибусь — рухнет вообще все начать с того, что шапка документа — один запрос, а вот табличная часть — делается кучей подзапросов с фильтрацией по элементу шапки (ну и уровень вложенности не один, и там тоже подзапросы). в общем я не знаю как там пользователи с этим работают — отчеты ждут часами и это нормальным считается
здесь бы по идее и надо переделывать в первую очередь. но по слухам эта система в ближайшее время (год-два) подохнет. поэтому нужно быстрое решение.
Здравствуйте, aios, Вы писали:
A> List <Block0> block0;
В третий раз повторюсь — Генери просто List block0 и не мучайся с генериками.
A>вложенность потенциально любая, на практике — 2. A>но пользователи хотят больше.
В теории вложенность может быть и бесконечной:
class Node
{
List<Node> children;
}
A>и все это хочу скормить библиотеке. убедился — вложенность поддерживает хорошо. A>пока кроме динамической генерации ничего в голову не приходит.
А чем предложение с Map не устраивает?
A>п.с. яву знаю на уровне "знаю C#"
Да всё то же что и в C#, только со всякими генериками бороться не надо.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
A>>>п.с. яву знаю на уровне "знаю C#" A>·>Да всё то же что и в C#, только со всякими генериками бороться не надо.
A>мап в моем понимании — словарь. как его будет жрать библиотека?
Любая приличная библиотека позволяет использовать Map вместо объекта.
Map<String, Object> person = new HashMap<>();
person.put("firstName", "John");
person.put("age", 21);
Map<String, Object> company = new HashMap<>();
company.put("name", "Horns");
company.put("owner", person);
Думаю, jxls не исключение. Просто используй Map<String, Object> вместо тех объектов, которые ты пытаешься генерировать, клади в них какие душе угодно свойства и значения любой вложенности и всё.
·>Не понял. Вопрос в том — накой тебе генерить класс с генериками?
Следующим вопросом будет "как перехватывать обращения к несуществующим свойствам и подкладывать свой ответ (как в Руби)" — и на этом разработку своего Map с генериками и шлюхами можно будет считать законченным
vsb>Думаю, jxls не исключение. Просто используй Map<String, Object> вместо тех объектов, которые ты пытаешься генерировать, клади в них какие душе угодно свойства и значения любой вложенности и всё.
Разобрали в соседнем топике. Там даже можно подсунуть SpEL как язык выражений, а он позволяет к мэпу обращаться через точку map.fullName вместо map["fullName"], но чуваку обязательно надо гланды ректально удалить.
B>Следующим вопросом будет "как перехватывать обращения к несуществующим свойствам и подкладывать свой ответ (как в Руби)" — и на этом разработку своего Map с генериками и шлюхами можно будет считать законченным
погуглил про мапы в связке с этой библиотекой. ненагуглилось ничего. повторюсь полный нуб я по яве. ни одной книжки не прочитал даже базы. чисто на "схожести" с шарпом орудую (блин в стринге нету инсерт даже — изврат через конкатенацию — я хренею на этот язык... да, да, про StringBuilder знаю, просто к слову)
Здравствуйте, aios, Вы писали:
B>>Следующим вопросом будет "как перехватывать обращения к несуществующим свойствам и подкладывать свой ответ (как в Руби)" — и на этом разработку своего Map с генериками и шлюхами можно будет считать законченным A>погуглил про мапы в связке с этой библиотекой. ненагуглилось ничего.
Ну вот нагуглилось:
The created List<Map<String, Object>> is then processed by jx:each command in a regular way.
Map elements are accessed using square brackets, e.g.
Открой исходники либы, в конце концов, если уж доки недостаточно понятны.
A>повторюсь полный нуб я по яве. ни одной книжки не прочитал даже базы.
Да я тоже ни одной книжки не прочитал. Но вспомни, что c# делался как калька с java — какая разница-то?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай