如何替换方法返回类型?

时间:2013-10-31 15:54:00

标签: java java-bytecode-asm bytecode-manipulation

这只是一个有趣的学习实验。我正在玩bytecode操纵。

我只是在asm中使用java进行学习。我想知道是否可以从接口替换方法的返回类型。

假设我有interface

interface Modifiable {
    Integer a();
}

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

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

6 个答案:

答案 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将是您的类型。