想象一下有课
public class sample {
private String fieldName;
}
哪个已经编译并且当jam jams出现时claspath的一部分。
我想为@notnull
(非等级)动态添加@size(min=1,max=5)
和fieldName
任何建议plz
答案 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注释的类。现在,当你跑步时,你会发现它有它。
关于本守则的说明:
- 您会发现在尝试重新定义课程时我们没有使用
Subclass.class
这是以防止在创建替代
之前加载类使用
Subclass.class
将调用类加载器来加载原始类,这可以防止ByteBuddy执行其工作- 我们已经实施了#34;我们要添加的注释界面(在此示例中为
醇>FunctionalInterface
)。
欲了解更多信息: