【发布时间】:2020-03-10 19:36:39
【问题描述】:
我正在尝试将基于字符位置的行解析为属性,就像 beanIo 这样的外部库所做的那样,但没有真正使用 beanIo(http://beanio.org/2.1/docs/reference/index.html#BuilderApiAndAnnotations)
我想使用注释,这是我苦苦挣扎的地方,我认为我对它们的理解还不够。 我的用例:
String stringToParse = "0_2_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
不太了解自定义注释的用法,所以甚至不确定上面是我应该怎么做的..
【问题讨论】:
-
您实际上是在寻找一个 java 注释处理器教程,也就是 APT,您需要构建的处理器并不难,所以首先手动编写您希望生成的代码,然后按照任何 APT 教程编写一个处理器来生成代码。
-
谢谢,会调查一下
标签: java spring annotations annotation-processing