【问题标题】:Is it possible to inject a method in built-in class in Java? [duplicate]是否可以在 Java 的内置类中注入方法? [复制]
【发布时间】:2021-10-20 10:33:47
【问题描述】:

在 JavaScript 中,很容易修改(甚至完全替换)内置类。只需键入= 并定义一个函数,就可以简单地编写一个方法的名称并将其注入到 JavaScript 的内置类中。然后可以在该类的每个实例上使用此方法。

例如,我将 multiply 方法注入到 String JavaScript 内置类中,该方法将字符串对象包含给定次数的字符串相乘。

我可以在 Java 中做类似的事情吗?

我知道我可以扩展一些内置类并在我的自定义类中定义这个方法。但是,是否可以像在 JavaScript 中一样在内置 Java 类中注入方法,以便在程序中使用该类的任何地方都可以使用此自定义方法?

【问题讨论】:

  • 听起来像an XY problem。你在这里的最终目标是什么?
  • 不,这不是 XY,这只是一个假设性问题。我没有实际需要注入方法。我只是想知道这在 Java 中是否可行,因为我在网上找不到任何关于如何做到这一点的指南。

标签: javascript java


【解决方案1】:

这可以在运行时进行。但简单的答案是您不想这样做。字节码修改极其脆弱和复杂。更不用说如果你直接调用你注入的新方法,你的代码也不会编译,这意味着你必须求助于反射等昂贵的方法。

您最好的选择是为具有此乘法方法的字符串创建一个实用程序类。像这样的:

public class StringUtil {
    public static String multiply(String s1, int i) { ... }
}

对于非最终类(不是 String 类),您还可以选择扩展该类并将您的方法添加到新创建的类中:

public class MyType extends Type {
    public static SomeType someMethod() { ... }
}

这将要求您将所有类型的Type 替换为MyType

我不完全理解您的示例,但听起来 String#repeat(int) 可能与您尝试实现的目标相同。

【讨论】:

  • OP 在询问一些不同的事情。在 JavaScript、C# 和更多语言中,您可以在运行前定义并使用扩展方法,例如 "HelloWorld".yourMethod()
  • 我在第一段中回答了这个问题。它们是可能的,但实施起来非常脆弱。
  • 谢谢。是的,repeat 方法是我会使用的方法。我只是以multiply 作为方法名称和功能的示例。我不会注入这种方法,当然,我会按照您为此目的所建议的那样使用repeat。这只是一个假设性问题。
  • @bramhaag 这不是有效的答案,因为扩展运行时与 JS/C# 的工作方式不同,因为您只能使用反射。正确的答案是,这可以通过注释处理来实现,因此该方法可以在编译期间使用。在这里查看示例projectlombok.org/features/experimental/ExtensionMethod
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2012-05-09
  • 2020-03-25
相关资源
最近更新 更多