在Byte Buddy中生成参数注释

时间:2018-03-04 02:36:55

标签: java annotations byte-buddy

我想使用ByteBuddy生成这样的简单接口:

public interface MyInterface {
    void myMethod(@Deprecated String myDeprecatedParameter);
}

这只是一个例子,但关键是方法的参数需要许多自定义注释。 有没有人有一个简单的例子来演示如何在ByteBuddy中实现这个目标?

1 个答案:

答案 0 :(得分:2)

您可以使用带注释的参数创建一个接口,如下所示。首先定义接口名称和修饰符,然后使用它的名称,返回类型和修饰符定义方法,最后定义参数和注释(如果有)。

Class<?> myInterface = new ByteBuddy()
        .makeInterface()
        .name("MyInterface")
        .modifiers(Visibility.PUBLIC, TypeManifestation.ABSTRACT)
        .defineMethod("myMethod", void.class, Visibility.PUBLIC)
        .withParameter(String.class, "myDeprecatedParameter")
        .annotateParameter(AnnotationDescription.Builder.ofType(Deprecated.class)
                .build())
        .withoutCode()
        .make()
        .load(this.getClass().getClassLoader())
        .getLoaded();

如果您需要多个注释,可以多次拨打annotateParameter(...)

make()方法之后,您将获得卸载的类,只需加载该类并使用它。

以下是一些带有接口类的反射api的打印件。

System.out.println(Modifier.toString(myInterface.getModifiers())); // public abstract interface
System.out.println(myInterface.getSimpleName()); // MyInterface
System.out.println(Arrays.toString(myInterface.getDeclaredMethods())); // [public abstract void MyInterface.myMethod(java.lang.String)]

Method method = myInterface.getDeclaredMethod("myMethod", String.class);
System.out.println(method.getName()); // myMethod
System.out.println(Arrays.toString(method.getParameters())); // [java.lang.String myDeprecatedParameter]

Parameter parameter = method.getParameters()[0];
System.out.println(parameter); // java.lang.String myDeprecatedParameter
System.out.println(parameter.getName()); // myDeprecatedParameter
System.out.println(Arrays.toString(parameter.getAnnotations())); // [@java.lang.Deprecated()]

Annotation annotation = parameter.getAnnotations()[0];
System.out.println(annotation); // @java.lang.Deprecated()
相关问题