如何让字节好友创建的子接口继承类型标注



我有这个伪测试来创建子接口,我想从接口 S 复制注释,但它不起作用。我做错了什么?

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.implementation.attribute.MethodAttributeAppender;
import net.bytebuddy.implementation.attribute.TypeAttributeAppender;
import net.bytebuddy.matcher.ElementMatchers;
import org.apache.tapestry5.ioc.annotations.EagerLoad;
import org.apache.tapestry5.ioc.annotations.NotLazy;
public class InheritedMethodTest {
    public static void main(String... args) throws Exception {
        Method im = I.class.getMethod("list");
        System.out.println(Arrays.toString(I.class.getAnnotations()));
        System.out.println(im.getDeclaringClass());
        System.out.println(im.getGenericReturnType());
        System.out.println(Arrays.toString(im.getAnnotations()));
        System.out.println();
        Method sm = S.class.getMethod("list");
        System.out.println(Arrays.toString(S.class.getAnnotations()));
        System.out.println(sm.getDeclaringClass());
        System.out.println(sm.getGenericReturnType());
        System.out.println(Arrays.toString(sm.getAnnotations()));
        System.out.println();
        Class<? extends Object> f = new ByteBuddy()
                .makeInterface(S.class)
                .attribute(TypeAttributeAppender.ForInstrumentedType.INSTANCE)
                .method(ElementMatchers.not(ElementMatchers
                        .isDeclaredBy(Object.class)))
                .withoutCode()
                .attribute(
                        MethodAttributeAppender.ForInstrumentedMethod.INCLUDING_RECEIVER)
                .make()
                .load(InheritedMethodTest.class.getClassLoader(),
                        ClassLoadingStrategy.Default.INJECTION).getLoaded();
        Method fm = f.getMethod("list");
        System.out.println(Arrays.toString(f.getAnnotations()));
        System.out.println(fm.getDeclaringClass());
        System.out.println(fm.getGenericReturnType());
        System.out.println(Arrays.toString(fm.getAnnotations()));
        System.out.println(Arrays.toString(f.getInterfaces()));
    }
    public static interface I<A> {
        @NotLazy
        List<A> list();
    }
    @EagerLoad
    public static interface S extends I<String> {
    }
}

替换

attribute(TypeAttributeAppender.ForInstrumentedType.INSTANCE)

命令者

annotateType(S.class.getDeclaredAnnotations())

属性追加程序仅应用由检测类型直接声明的批注。在创建具有潜在多个超级接口的接口的情况下,无法复制注释,因为如果多个接口声明相同的注释,这可能会导致冲突。有关属性追加器的详细说明,请参阅 TypeAttributeAppender.ForInstrumentedType 的文档。

最新更新