Я пытаюсь разобрать строку на основе расположения символов в свойствах, что-то вроде того, что делает внешняя библиотека, такая как beanIo, но без реального использования beanIo(http://beanio.org/2.1/docs/reference/index.html#BuilderApiAndAnnotations)
Я хотел бы использовать аннотации, и именно здесь я борюсь, я не думаю, что понимаю их достаточно. Мой вариант использования:
String stringToParse = "0Record record = new Record(stringToParse); // this should create a key value pairs
/*record = <
"Age": Field{name:"Age",value:"MYAGE", at:13, length:5}
"Name": Field{name:"Name",value:"MYNAME", at:6, length:6}
>
4_MYNAME_MYAGE_";
Объект, который я должен построить после анализа приведенной выше строки, должен выглядеть примерно так:
Record record = new Record(stringToParse); // this should create a key value pairs
/*record = <
"Age": Field{name:"Age",value:"MYAGE", at:13, length:5}
"Name": Field{name:"Name",value:"MYNAME", at:6, length:6}
>
Я хочу добиться этого с помощью аннотации, хотя я не совсем понимаю, как они читаются или должны читаться, вот что у меня есть прямо сейчас:
Моя полевая аннотация
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Field {
public String name();
public int at();
public int length();
public String value() default "[unassigned]"; // should be determined using the other values, not passed-in
}
Аннотация к моей записи:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Record {
//Not sure what should goes here. Maybe: public HashMap<String, Field> record
}
Вот как я использую это в классе
@Record
public class PersonInfoLine {
@Field(at = 5, length = 6)
private String name;
@Field(at = 13, length = 5)
private String age;
}
Снова, когда я создаю экземпляр PersonInfoLine со строкой, я хотел бы получить «имя» и «возраст», что-то вроде:
String stringToParse = "0_2_4_MYNAME_MYAGE_";
PersonInfoLine personInfoLine = new PersonInfoLine(stringToParse);
String name = personInfoLine.record.get("name").value; //MYNAME
String age = personInfoLine.record.get("age").value; //MYAGE
На самом деле не очень понимаю использование пользовательских аннотаций, поэтому даже не уверен, что вышеизложенное - это то, как я должен это делать.