java - 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 是否允许从刚刚创建的另一个类创建一个类?
解决方案
如果你正在重新定义一个类,你正在编辑它已经存在的类文件,所有现有的方法都被保留。这真的是你在这里想要做的吗?我宁愿定义一个新接口并将方法添加到它,那么您就不会遇到异常。
您看到此错误的原因是您正在使用类加载器加载接口,该类加载器不保留原始字节码作为未来编辑所需的资源。提供ClassLoadingStrategy.Default.WRAPPER_PERSISTENT
作为第二个参数load
,你会绕过它。
推荐阅读
- python - 如何在 Python 中过滤和写入多个文件?
- java - MongoDB:“MongoSocketException:mongodb:提供节点名或服务名,或未知”
- sql-server - SQL Server:引用其他视图的视图列表
- javascript - API 和接口(对象类型)如何可供 JavaScript 使用?
- javascript - 将参数传递到 URL
- java - Java:ImageIcon - 图像文件更新,但 Java 框架中的图像图标没有
- android - 步进器内的日期选择器
- laravel - 通过回答安全问题手动重置密码而不发送电子邮件 - Laravel/auth
- r - 如何在ggplot lineplot中为具有相似颜色的多个子类着色?
- date - Applescript:通过添加具有奇怪行为的天数来增加月份