这只是一个有趣的学习实验。我在bytecode
玩弄操纵。
我只是在胡闹学习asm
in java
。我想知道是否可以从接口替换方法的返回类型。
假设我有一个interface
:
interface Modifiable {
Integer a();
}
我应该创建一个类的副本,将其加载到 中class loader
,然后修改这个新接口吗?
如果可能的话,这种变化会在编译时可用吗?可以这么说,我ide
自动完成这些新方法。
这只是一个有趣的学习实验。我在bytecode
玩弄操纵。
我只是在胡闹学习asm
in java
。我想知道是否可以从接口替换方法的返回类型。
假设我有一个interface
:
interface Modifiable {
Integer a();
}
我应该创建一个类的副本,将其加载到 中class loader
,然后修改这个新接口吗?
如果可能的话,这种变化会在编译时可用吗?可以这么说,我ide
自动完成这些新方法。
你不能在不改变接口本身的情况下改变返回类型。
您必须更改界面本身。
无法在运行时更改方法的返回类型。
我想将返回类型更改为布尔值。这可能吗?
您可以将文本从 更改Integer
为Boolean
。
您可以在运行时执行此操作,但除非更改所有实现,否则它会使接口无法使用。
我应该创建一个类的副本,将其加载到类加载器中,然后修改这个新接口吗?
如果你喜欢,但我不明白这一点。
如果可能的话,这种变化会在编译时可用吗?
是的,将单词从 Integer 更改为 Boolean。在您的 IDE 中更容易做到。
在编译时,您绝对不能更改方法的返回类型。在运行时,是的,这是可能的。但这根本不是一个好主意。以下来自asm的指南,可能会对您有所帮助
您必须在使用 ClassVisitor 访问原始方法/字段时返回替换方法/字段,或者您必须先删除 ClassVisitor 中的原始方法/字段(请参阅“ 1. 如何删除方法/字段? ”),并且然后通过调用 ClassWriter 上的访问方法来添加新方法/字段。
我看到的问题是,曾经使用实现 Modifiable 的 Object 的人会期望在调用该方法时返回一个 Integer。您违反了此界面的创建者做出的承诺。
您当然可以创建自己的类来扩展接口方法返回的类型。我不建议对像 Integer 这样的东西使用此方法,因为 Integer 的使用方式有很多种,但在技术上是可行的。
据我所知,它不能在运行时完成。但你可以使用泛型来做到这一点。
在你的例子中,这样做
interface Modifiable<T> {
T a();
}
其中 T 将是您的类型。