Java 如何替换方法返回类型?

Java 如何替换方法返回类型?,java,java-bytecode-asm,bytecode-manipulation,Java,Java Bytecode Asm,Bytecode Manipulation,这只是一个有趣的学习实验。我在玩弄字节码操作 我只是为了在java中学习asm而胡闹。我想知道是否可以从接口替换方法的返回类型 假设我有一个接口: 我应该创建类的副本,将其加载到类加载器中,然后修改这个新接口吗 如果可能的话,这个更改在编译时可用吗?可以说,我的ide自动完成了这些新方法。如果不更改接口本身,就无法更改返回类型。必须更改接口本身 无法在运行时更改方法的返回类型 我想将返回类型更改为布尔型。这可能吗 可以将文本从整数更改为布尔值 您可以在运行时执行此操作,但如果不更改所有实现,则会

这只是一个有趣的学习实验。我在玩弄字节码操作

我只是为了在java中学习asm而胡闹。我想知道是否可以从接口替换方法的返回类型

假设我有一个接口:

我应该创建类的副本,将其加载到类加载器中,然后修改这个新接口吗


如果可能的话,这个更改在编译时可用吗?可以说,我的ide自动完成了这些新方法。

如果不更改接口本身,就无法更改返回类型。

必须更改接口本身

无法在运行时更改方法的返回类型

我想将返回类型更改为布尔型。这可能吗

可以将文本从整数更改为布尔值

您可以在运行时执行此操作,但如果不更改所有实现,则会使接口无法使用

我应该创建类的副本,将其加载到类加载器中,然后修改这个新接口吗

如果你喜欢的话,但我看不出有什么意义

如果可能的话,这个更改在编译时可用吗


是,将单词从整数改为布尔值。在IDE中要容易得多。

我看到的问题是,使用实现Modifiable的对象的人在调用该方法时都希望返回一个整数。您正在违背此界面的创建者所做的承诺


当然,您可以创建自己的类来扩展接口方法返回的类型。我不建议像Integer这样的东西使用这种方法,因为Integer有很多种使用方法,但在技术上是可行的。

据我所知,它不能在运行时完成。 但是您可以使用泛型来实现这一点

在你的例子中,像这样做

interface Modifiable<T> {
    T a();
}

其中T将是您的类型。

在编译时,您绝对不能更改方法的返回类型。在运行时,是的,这是可能的。但这根本不是一个好主意。下面是asm的指南,可能会对您有所帮助


使用ClassVisitor访问原始方法/字段时,必须返回替换方法/字段,或者必须首先在ClassVisitor中删除原始方法/字段,然后通过调用ClassWriter上的visit方法添加新方法/字段。

据我所知,它不起作用。我相信您不能重载返回类型。这个C++问题可能会给你一些解决方案,因为我在这个问题上明确地说,这是一个学习实验。这只是一个关于字节码操作的学习实验它是一个可行的选择,用它创建一个新的接口,然后在副本上进行修改?@ssedano这与修改现有接口有什么不同?正如我所说,这只是为了学习。然后,我可以从该接口创建一个类。如果您创建的第二个接口扩展了第一个接口,则为否。如果它不扩展第一个接口,则为是。@ssedano您可以从原始接口或副本创建一个类。复制不会改变任何事情。@ssedano看起来更像是无聊的好奇心,而不是学习目的。@ssedano除非有理由这样做,在这种情况下我可以建议一种替代方法,否则似乎没有任何理由这样做。仅仅因为你能做某件事并不能让它成为一个好主意。谢谢你的评论,但这只是一个实验。
interface Modifiable<T> {
    T a();
}