-1

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

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

假设我有一个interface

interface Modifiable {
    Integer a();
}

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

如果可能的话,这种变化会在编译时可用吗?可以这么说,我ide自动完成这些新方法。

4

6 回答 6

5

你不能在不改变接口本身的情况下改变返回类型。

于 2013-10-31T15:56:50.840 回答
1

您必须更改界面本身。

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

于 2013-10-31T15:58:37.933 回答
1

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

您可以将文本从 更改IntegerBoolean

您可以在运行时执行此操作,但除非更改所有实现,否则它会使接口无法使用。

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

如果你喜欢,但我不明白这一点。

如果可能的话,这种变化会在编译时可用吗?

是的,将单词从 Integer 更改为 Boolean。在您的 IDE 中更容易做到。

于 2013-10-31T15:59:45.793 回答
1

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

您必须在使用 ClassVisitor 访问原始方法/字段时返回替换方法/字段,或者您必须先删除 ClassVisitor 中的原始方法/字段(请参阅“ 1. 如何删除方法/字段? ”),并且然后通过调用 ClassWriter 上的访问方法来添加新方法/字段。

于 2013-10-31T16:11:44.780 回答
0

我看到的问题是,曾经使用实现 Modifiable 的 Object 的人会期望在调用该方法时返回一个 Integer。您违反了此界面的创建者做出的承诺。

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

于 2013-10-31T16:02:45.067 回答
0

据我所知,它不能在运行时完成。但你可以使用泛型来做到这一点。

在你的例子中,这样做

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

其中 T 将是您的类型。

于 2013-10-31T16:03:23.500 回答