【问题标题】:ByteBuddy create class from created classByteBuddy 从创建的类创建类
【发布时间】:2020-02-19 15:44:26
【问题描述】:

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

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

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

IllegalStateException: 找不到类文件 第二接口。

示例代码:

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

【问题讨论】:

    标签: java byte-buddy


    【解决方案1】:

    如果您要对类进行变基,则您正在编辑其现有的类文件,其中所有现有方法都将保留。这真的是你在这里想要做的吗?我宁愿定义一个新接口并为其添加方法,这样您就不会遇到异常。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多