复杂注解
通过注解中的接口实现类的方法,对注解字段进行处理,为后续的翻译功能做准备。
ValueRenderer:值渲染接口
值渲染接口
public interface ValueRenderer {
Object render(Object value, Object data);
}
GenderRenderer:性别渲染
性别渲染类,1为男,其他为女
public class GenderRenderer implements ValueRenderer {
@Override
public Object render(Object value, Object data) {
if (value instanceof Integer) {
Integer longTermFlag = (Integer) value;
if (Integer.valueOf(1).equals(longTermFlag)) {
return "男";
}
return "女";
}
return value;
}
}
RegionRender:区域渲染
区域渲染类,"0"表示国内,其他表示国外
public class RegionRender implements ValueRenderer{
@Override
public Object render(Object value, Object data) {
if (value instanceof String) {
String flag = (String) value;
if ("0".equals(flag)) {
return "国内";
}
return "国外";
}
return value;
}
}
TestAnnotation :自定义注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
Class<? extends ValueRenderer>[] renderers() default {};
}
TestAnnotationService:测试
public class TestAnnotationService {
@TestAnnotation(renderers = GenderRenderer.class)
public Integer test=2;
@TestAnnotation(renderers = RegionRender.class)
public String place="1";
public Integer getTest() {
return test;
}
public void setTest(Integer test) {
this.test = test;
}
public String getPlace() { return place; }
public void setPlace(String place) { this.place = place; }
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
TestAnnotationService testAnnotationService=new TestAnnotationService();
Field[] fields = TestAnnotationService.class.getFields();
for(int i=0;i< fields.length;i++){
if(fields[i].isAnnotationPresent(TestAnnotation.class)){
TestAnnotation annotation = fields[i].getAnnotation(TestAnnotation.class);
System.out.println("field内容是"+fields[i]);
List<Class<? extends ValueRenderer>> renderList=new ArrayList<>();
for(int c=0;c<annotation.renderers().length;c++){
renderList.add(annotation.renderers()[c]);
System.out.println(annotation.renderers()[c]);
}
//获取方法的索引 例如 public java.lang.Integer annotion2.TestAnnotationService.test
int index=fields[i].toString().lastIndexOf(".")+1;
//根据索引截取具体的方法
String methodString =fields[i].toString().substring(index);
//将方法的首字母大写
String methodString1 = toUpperFirstCharacter(methodString);
//根据反射获取方法字段值,根据get方法获取
Class<?> cl = testAnnotationService.getClass();
Method getTest = cl.getDeclaredMethod("get"+methodString1);
Object invoke = getTest.invoke(testAnnotationService);
//调用具体的方法
for(Class<? extends ValueRenderer> render:renderList) {
Object render1 = render.getMethod("render", Object.class, Object.class).invoke(render.newInstance(), invoke, null);
System.out.println(render1);
}
}
}
}
/**
* 将字符串的首字母转大写
* @param s
* @return
*/
private static String toUpperFirstCharacter(String s) {
// 利用ascii编码的前移,效率要高于截取字符串进行转换的操作
char[] cs = s.toCharArray();
if (Character.isLowerCase(cs[0])) {
cs[0] -= 32;
return String.valueOf(cs);
}
return s;
}
}