注解三:复杂注解(值渲染)


通过注解中的接口实现类的方法,对注解字段进行处理,为后续的翻译功能做准备。

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值