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
的第二个参数,您将绕过它。
我有一个 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
的第二个参数,您将绕过它。