ByteBuddy 从创建 class 创建 class

ByteBuddy create class from created class

我有一个 interface 有一些方法(未知计数)。

我想创建另一个 interface 方法,它将具有相同的名称和参数类型,但不是 return 类型。

然后,我想使用第二个创建的 interface 通过 byteBuddy 创建一个新的 class。但是当我使用创建的 interface 创建一个新的时,我得到

IllegalStateException: Could not locate class file for SecondInterface.

示例代码:

Class<?> clazz
= new ByteBuddy()
    .makeInterface()
    .name("secondInterface")
    .make()
    .load(classLoader)
    .getLoaded();

for (Method method : FirstInterface.class.getMethods()) {

    Class<?>[] classes = method.getParameterTypes();
    List<Class<?>> classList = new ArrayList<Class<?>>(Arrays.asList(classes));
    classList.add(Object.class);

    clazz
    = new ByteBuddy()
        .rebase(clazz)
        .defineMethod(method.getName() + "Reverse", Void.class, Modifier.PUBLIC)
        .withParameters(classList)
        .withoutCode()
        .make()
        .load(classLoader)
        .getLoaded();
}

我做错了什么? byteBuddy 是否允许从刚刚创建的另一个创建 class?

如果您要变基 class,您就是在编辑它已经存在的 class 文件,其中保留了所有现有方法。这真的是你想在这里做的吗?我宁愿定义一个新接口并向其添加方法,那么你也不会 运行 进入异常。

您看到此错误的原因是您正在使用 class 加载器加载界面,该加载器不会将原始字节代码保留为未来编辑所需的资源。提供 ClassLoadingStrategy.Default.WRAPPER_PERSISTENT 作为 load 的第二个参数,您将绕过它。