【问题标题】:Annotation - how to add field level annotation in Java dynamically注释 - 如何在 Java 中动态添加字段级注释
【发布时间】:2018-02-12 12:13:10
【问题描述】:

想象有课

public class sample {
   private String fieldName;
}

jam statsup 时已经编译和部分 claspath。

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

大家有什么建议

【问题讨论】:

  • 您是否尝试过使用 ByteBuddy、Javassist、ASM 或 CGLib 等字节码操作库?
  • 是的。如果可以的话无法设置注释你能分享代码吗??
  • 你不能(或者至少真的不应该)添加这样的验证规则。相反,您可以通过XML file 在外部提供规则。这里有教程。请参阅第 1 页底部和第 2 页开头。

标签: java reflection annotations spring-annotations


【解决方案1】:

我将尝试将问题作为 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. 我们“实现”了要添加的注释接口(本例中为FunctionalInterface)。

更多信息:

ByteBuddy tutorial

【讨论】:

  • 这不适用于方法级别注释,但我正在寻找现有对象的变量级别注释
猜你喜欢
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2014-08-13
  • 2012-07-01
  • 2017-08-01
  • 2011-05-05
相关资源
最近更新 更多