完成你想要的最简单的方法是实现你自己的注释并创建一个绑定。然后将任何此类String
值添加到类的常量池中并从那里简单地返回。
您可以在 Byte Buddy 教程的底部找到创建自定义注释的示例。要实现自定义@Signature
注释,您将执行以下操作:
enum SignatureBinder
implements TargetMethodAnnotationDrivenBinder.ParameterBinder<StringValue> {
INSTANCE; // singleton
@Override
public Class<Signature> getHandledType() {
return Signature.class;
}
@Override
public MethodDelegationBinder.ParameterBinding<?> bind(AnnotationDescription.Loaded<StringValue> annotation,
MethodDescription source,
ParameterDescription target,
Instrumentation.Target instrumentationTarget,
Assigner assigner) {
if (!target.getTypeDescription().represents(String.class)) {
throw new IllegalStateException(target + " makes illegal use of @Signature");
}
StackManipulation constant = new TextConstant("<signature goes here>");
return new MethodDelegationBinder.ParameterBinding.Anonymous(constant);
}
}
MethodDescription
命名的对象source
描述了被拦截的方法,并提供了一个类似于Method
类的接口。然后,您将使用 注册此活页夹,MethodDelegation
然后您可以在委托中使用注释。
附带说明:我会避免使用规范名称。这些名称可能有冲突,例如类
foo.Bar$Qux
foo.Bar.Qux
曾经是具有Bar
内部类的类Qux
和曾经是具有类的包具有Qux
相同的名称。我知道这不太可能,但你永远不知道用户代码会是什么样子。