С помощью %3c
можно сканировать три символа. Это не завершает массив нулем, поэтому нельзя использовать ни одну из строковых функций, ожидающих этот нулевой терминатор. Спецификатор %n
возвращает количество символов, обработанных при сканировании.
Печать можно выполнить, ограничив количество символов с помощью поля точности в %.3s
#include <stdio.h>
#include <stdlib.h>
int main( void) {
char str[]="ABCDEFGHIJKL";
int count = 0;
int span = 0;
int used = 0;
char arr[6][3]={};
while ( count < 6 && 1 == sscanf ( str + span, "%3c%n", &arr[count][0], &used)) {
count++;
span += used;//accumulate number of scanned characters
}
while ( count) {
count--;
printf ( "%.3s\n", arr[count]);//print up to three characters
}
return 0;
}
Всегда есть apache commons beanutils , но, конечно, он использует отражение под капотом
Вы должны написать универсальный Сервис преобразования! Используйте дженерики, чтобы сохранить тип свободным (чтобы вы могли преобразовать каждый объект в ключ => значение и обратно).
Какое поле должно быть ключом? Получите это поле из компонента и добавьте любое другое непереходное значение в карту значений.
Путь назад довольно легкий. Прочитайте ключ (x) и запишите сначала ключ, а затем каждую запись в списке обратно в новый объект.
Мой JavaDude Bean Annotation Processor генерирует код для этого.
http://javadude.googlecode.com
Например:
@Bean(
createPropertyMap=true,
properties={
@Property(name="name"),
@Property(name="phone", bound=true),
@Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
}
)
public class Person extends PersonGen {}
Выше генерируется суперкласс PersonGen, который включает метод createPropertyMap (), который генерирует Map для всех свойств, определенных с помощью @Bean.
(Примечание что я немного изменю API для следующей версии - атрибут аннотации будет defineCreatePropertyMap = true)
Если вы не хотите жестко кодировать вызовы для каждого метода получения и установки, отражение - единственный способ вызвать эти методы ( но это не сложно).
Можете ли вы провести рефакторинг рассматриваемого класса, чтобы использовать объект Properties для хранения фактических данных, и позволить каждому получателю и установщику просто вызывать get / set для него? Тогда у вас есть структура, хорошо подходящая для того, что вы хотите сделать. Есть даже методы для сохранения и загрузки их в форме ключ-значение.
JSON , например, использующий XStream + Jettison, представляет собой простой текстовый формат с парами ключ-значение. Он поддерживается, например, брокером сообщений Apache ActiveMQ JMS для обмена объектами Java с другими платформами / языками.
Генерация кода была бы единственным способом, о котором я могу думать. Лично я получил решение для многократного использования отражений (если только эта часть кода не критична для производительности). Использование JMS звучит как излишнее (дополнительная зависимость, и это даже не то, для чего она предназначена). Кроме того, он, вероятно, использует отражение под капотом.
Вы могли бы использовать фреймворк Joda:
http: //joda.sourceforge. net /
и воспользуйтесь JodaProperties. Однако это оговаривает, что вы создаете bean-компоненты определенным образом и реализуете определенный интерфейс. Тем не менее, он позволяет вам возвращать карту свойств из определенного класса без отражения. Пример кода находится здесь:
http://pbin.oogly.co.uk/listings/viewlistingdetail/0e78eb6c76d071b4e22bbcac748c57
Лучшее решение - использовать Dozer. Вам просто нужно что-то вроде этого в файле сопоставления:
<mapping map-id="myTestMapping">
<class-a>org.dozer.vo.map.SomeComplexType</class-a>
<class-b>java.util.Map</class-b>
</mapping>
И все, обо всем остальном позаботится Dozer !!!
Много потенциальных решений, но давайте добавим еще одно. Используйте Jackson (JSON processing lib) для выполнения "json-менее" преобразования, например:
ObjectMapper m = new ObjectMapper();
Map<String,Object> props = m.convertValue(myBean, Map.class);
MyBean anotherBean = m.convertValue(props, MyBean.class);
(эта запись в блоге содержит еще несколько примеров)
Вы можете, в основном, преобразовывать любые совместимые типы: совместимые, то есть, если бы вы действительно преобразовывали из типа в JSON, и из этого JSON в результирующий тип, то записи бы совпадали (если правильно сконфигурировать, то можно просто игнорировать нераспознанные).
Хорошо работает для случаев, которые можно ожидать, включая Карты, Списки, массивы, примитивы, бобовые POJO.