标签 注解 下的文章

Java 工程中注解配合切面往往能带来事半功倍的效果,但是注解有的时候并不是太灵活,例如方法注解无法指定一些自定义的参数,很多时候还是需要到方法里面去做一些侵入性的逻辑来完成想要的操作;为了解决这个痛点,我写了个 demo 通过反射+递归的方式来给方法注解提供解析动态参数的能力,例如对于 void doSomething(Entity entity) 这个方法,可以通过 @RecordEvent(code = "TEST", keyWord = "{entity.id}", content = "content is {entity.nested.foo}") 注解中的花括号来取到入参中 entity 参数的某些值,且支持无限递归获取子属性的值,demo 代码如下:

有这么两个参数类型,其中Entity类中包含类型为Nested的属性

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Entity {
    private int id;
    private String name;
    private String otherField;
    private Nested nested;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Nested {
    private String foo;
    private int bar;
}

有一个方法,其第一个入参名为entity,可以使用“{entity.nested.foo}”这样的模板字符串,切面处理时会把模板字符串自动替换为对应入参属性的getter值,支持无限级往下查属性,查到最后的属性(本例中为foo)将其toString替换到模板。

@Override
@RecordEvent(code = "TEST", keyWord = "{entity.id}", content = "content is {entity.nested.foo}")
public void doSomething(Entity entity) {
    int a = 2*2;
    // some other logic
    log.info("done");
}
public static void main() {
    Entity entity = new Entity(1, "hello", "world", new Nested("bar", 111));
    xxxService.doSomething(entity);
}

调用时生成事件:EventPublishRequestDto(source=OPS, code=TEST, keyWord=1, content=content is bar, dateTime=2021-07-27T17:06:19.593)

具体方法是将模板参数用分隔符分割成队列,队列的第一个值是入参名,第二个值往后依次出队递归拿到文本对应的属性,以此类推直到队列为空,递归结束返回最深层的值

demo 源码如下:

- 阅读剩余部分 -

最近写代码时发现将枚举类暴露到 dict 接口时总需要做一些重复的装配工作,于是写了这么个工具类来提供枚举类的自动暴露功能。通过在想要暴露的枚举类属性上引用@DictApi注解,不需要再写额外的逻辑即可将对应枚举类和字段暴露出来。

期望

  1. 添加枚举类时可以低成本或无成本地添加到已有的枚举字典接口,不需要写额外的逻辑
  2. 可以指定枚举类哪些字段是需要暴露的,且可以指定字典接口中的属性别名
  3. 支持私有属性通过公有的Getter()方法获取属性值

实现

- 阅读剩余部分 -