【问题标题】:JShell - How to add method to existing class without replacing this class?JShell - 如何在不替换此类的情况下向现有类添加方法?
【发布时间】:2017-09-09 14:27:57
【问题描述】:

tl;dr:如何在不替换此类的情况下向现有类添加方法?

说明

当我在 JShell 中运行以下命令时:

public class TestClass {}

打印以下输出:

created class TestClass

再次运行此命令会给出以下输出:

modified class TestClass

让我们用一种方法创建类,如下所示:

public class TestClass {
    public static void testMethod1() {
        System.out.println("In testMethod1");
    }      
}

值得一提的是,输出与之前的类覆盖略有不同:

replaced class TestClass

运行testMethod1 成功结束,In testMethod1 打印在控制台中。

现在我想在不丢失testMethod1 的情况下向现有TestClass 添加新方法。所以我运行以下 sn-p:

public class TestClass {
    public static void testMethod2() {
        System.out.println("In testMethod2");
    }      
}

...而testMethod1 丢失了,因为整个TestClass 已被替换。

如何在不覆盖现有类的情况下添加新方法?如果我写了 10 种方法怎么办?我是否应该在要添加到类的新方法旁边写下现有方法? JShell 不应该以警告的形式提示用户要替换的类吗?

感谢任何提示或帮助。

【问题讨论】:

  • 你不能。那会很痛苦。是的。显然没有。

标签: java java-9 jshell


【解决方案1】:

JShell 无法做到这一点,我认为这不是大多数人想要的。如果您想定期合并到现有代码中,您可能希望使用一个能够保持源代码完整并从头开始编译源代码的编辑器。除了已编译的字节码之外,JShell 还需要跟踪各种源代码信息,以实现您想要的。例如,如果您在定义泛型方法时添加了一个已经作为桥接方法实现的方法,会发生什么情况?

消息与 replacedmodified 不同的原因是因为 JShell 使用了 HotSwap,它只能在类不改变其形状时应用,即声明具有相同签名的相同方法和字段。

【讨论】:

  • 很好解释,先生。谢谢。
【解决方案2】:

如何在不覆盖现有类的情况下添加新方法?

您可以使用

/edit

这会打开一个 Jshell 编辑板,您可以在其中添加新方法和 Accept 以根据您的情况更新类定义。 jshell commands 还说明了使用nameid 编辑多个sn-ps 的其他几个属性。添加如何执行此操作的屏幕截图:

如果我写了 10 种方法怎么办?我是否应该在要添加到类的新方法旁边写下现有方法?

这样的用例似乎更关注 IDE 而不是基于 REPL 的 jshell,并且在 JEP#222 jshell: The Java Shell (Read-Eval-Print Loop) 上明确提及为非目标

超出范围的是图形界面和调试器支持。 JShell API 旨在允许在 IDE 和其他 工具,但 jshell 工具并不是一个 IDE。


JShell 不应该以警告的形式提示用户要替换的类吗?

会像 cmets 中提到的那样第二个 @Elliot,显然它现在没有。 虽然这听起来很有趣,恕我直言,但必须同样权衡实施它的想法,同时不要降低工具的性能。 @Rafael 的回答提供了有关维护此类开销的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2021-09-05
    • 2013-05-16
    • 2023-03-24
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多