首页 > 解决方案 > ByteBuddy 从创建的类创建类

问题描述

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

我想interface用方法创建另一个,它具有相同的名称和参数类型,但没有返回类型。

然后,我想使用 second createdinterface来创建一个新class的 by byteBuddy。但是当我使用 createdinterface来创建一个新的时,我得到

IllegalStateException:找不到 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 是否允许从刚刚创建的另一个类创建一个类?

标签: javabyte-buddy

解决方案


如果你正在重新定义一个类,你正在编辑它已经存在的类文件,所有现有的方法都被保留。这真的是你在这里想要做的吗?我宁愿定义一个新接口并将方法添加到它,那么您就不会遇到异常。

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


推荐阅读