定义注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.FIELD}) //定义注解的作用目标**作用范围字段、枚举的常量/方法
public @interface FieldMeta {
int len() default 10;//长度,默认为10。
}
定义类使用注解
public class BillItemHuawei {
@FieldMeta(len=10)
private int recordType;// Integer 4 记录类型。 25:ismpRecord
@FieldMeta(len=10)
private int streamNo;// Integer 4 流水号,由网关生成,最大值为4294967295。
@FieldMeta(len=10)
private String timeStamp;// Octet String 10 时间戳,由发端设备生成,网关收到消息的时间。格式:月日时分秒。
@FieldMeta(len=20)
private String msgID;
}
利用注解
public String getLine(BillItemHuawei item) {
Class c = item.getClass();
Field fields[] = c.getDeclaredFields();
StringBuffer sb = new StringBuffer();
for(int i=0;i<fields.length;i++){
sb.append(getPropertyValue(item, fields[i]));
if(i!=fields.length-1){
sb.append(PropertiesUtil.getProperties("fieldSeparator"));
}
}
//System.out.println(sb.toString());
return sb.toString();
}
public String getPropertyValue(Object owner, Field field) {
FieldMeta meta;
int len = 10;
String formatStr = "";
meta = field.getAnnotation(FieldMeta.class);
if(meta != null){
len = meta.len();
if(field.getType().getName().equals("int")){
formatStr = "%0" + len + "d";
}else{
formatStr = "%-" + len + "s";
}
}
Object o = getPropertyValue(owner, field.getName());
return String.format(formatStr, o);
}
public Object getPropertyValue(Object owner, String methodName) {
Class ownerClass = owner.getClass();
methodName = methodName.substring(0, 1).toUpperCase()
+ methodName.substring(1);
Method method = null;
try {
method = ownerClass.getMethod("get" + methodName);
Object o=method.invoke(owner);
if(o==null)
return "";
return o;
} catch (Exception e) {
return " can't find 'get" + methodName + "' method";
}
}
原文
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于