这只是一个有趣的学习实验。我正在玩bytecode
操纵。
我只是在asm
中使用java
进行学习。我想知道是否可以从接口替换方法的返回类型。
假设我有interface
:
interface Modifiable {
Integer a();
}
我应该创建该类的副本,将其加载到class loader
,然后修改这个新接口吗?
如果可能,这个更改将在编译时提供?可以这么说,我的ide
自动完成了这些新方法。
答案 0 :(得分:5)
如果不更改界面本身,则无法更改返回类型。
答案 1 :(得分:1)
您必须更改界面本身。
无法在运行时更改Method的返回类型。
答案 2 :(得分:1)
我想将返回类型更改为Boolean。这可能吗?
您可以将文字从Integer
更改为Boolean
。
您可以在运行时执行此操作,但除非所有实现都已更改,否则会使接口无法使用。
我应该创建该类的副本,将其加载到类加载器中,然后修改这个新接口吗?
如果你愿意,但我不明白这一点。
如果可能,这个更改将在编译时提供?
是的,将单词从Integer更改为Boolean。在IDE中更容易做到。
答案 3 :(得分:1)
在编译时,你肯定无法改变方法的返回类型。在运行时,是的,这是可能的。但这根本不是一个好主意。从asm下面的指南,可能会帮助你
当您使用ClassVisitor访问原始方法/字段时,您必须返回替换方法/字段,或者您必须首先删除ClassVisitor中的原始方法/字段(请参阅“1. How do I remove a method/field?”),然后添加通过在ClassWriter上调用visit方法来获取新方法/字段。
答案 4 :(得分:0)
我看到的问题是,谁曾使用实现Modifiable的Object将期望在调用该方法时返回一个Integer。您违反了此接口的创建者所做出的承诺。
您当然可以创建自己的类,扩展interfaced方法返回的类型。我不推荐像Integer这样的东西,因为可以使用Integer的方法很多但技术上可行。
答案 5 :(得分:0)
据我所知,它不能在运行时完成。 但你可以使用泛型来做到这一点。
在您的示例中,请执行
interface Modifiable<T> {
T a();
}
其中T将是您的类型。