注释 - 如何动态地在Java中添加字段级注释

时间:2018-02-12 12:13:11

标签: java reflection annotations spring-annotations

想象一下有课

public class sample {
   private String fieldName;
}

哪个已经编译并且当jam jams出现时claspath的一部分。

我想为@notnull(非等级)动态添加@size(min=1,max=5)fieldName

任何建议plz

1 个答案:

答案 0 :(得分:0)

我会尝试将问题作为ByteBuddy问题回答,而不是验证概要。

使用ByteBuddy,您可以在运行时更改类。但在某些情况下,就像你不在Android上一样(Dalvik的虚拟机与普通的JVM不同),你不应该改变已经加载的类。

class Subclass {
    public void func() {

    }
}

class FunctionalInterfaceImpl implements FunctionalInterface {
    @Override
    public Class<? extends Annotation> annotationType() {
        return FunctionalInterface.class;
    }
}

public class TryingByteBuddy {

    public static void main(String[] args) {

        new ByteBuddy()
            .redefine(TypePool.Default.ofClassPath().describe("com.experiments.Subclass").resolve(),
                    ClassFileLocator.ForClassLoader.ofClassPath())
            .annotateType(new FunctionalInterfaceImpl())
            .make()
            .load(ClassLoader.getSystemClassLoader());

        System.out.println(Arrays.deepToString(new Subclass().getClass().getAnnotations()));
    }

}

在此代码中,Subclass是一个没有@FunctionalInterface注释的类。现在,当你跑步时,你会发现它有它。

关于本守则的说明:

  
      
  1. 您会发现在尝试重新定义课程时我们没有使用Subclass.class      
        

    这是以防止在创建替代

    之前加载类          

    使用Subclass.class将调用类加载器来加载原始类,这可以防止ByteBuddy执行其工作

      
  2.   
  3. 我们已经实施了#34;我们要添加的注释界面(在此示例中为FunctionalInterface)。
  4.   

欲了解更多信息:

ByteBuddy tutorial