是否可以替换 Java 中的公共静态方法?

发布于 2024-12-28 16:12:47 字数 184 浏览 1 评论 0原文

我使用的库在 Utils 类中定义了公共静态方法 getFile()。该库在内部大量使用Utils.getFile(),但该方法实现得不是很好。

我想知道是否可以以某种方式重写 Utils.getFile() 以便它可以使用我的实现?

I'm using a library that has a public static method getFile() defined in the Utils class. The library uses Utils.getFile() a lot internally, but this method is not very well implemented.

I was wondering if it's possible to somehow override Utils.getFile() so it would use my implementation instead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

临走之时 2025-01-04 16:12:47

不 - 不是复制类并在那里替换它。否则,更好的选择可能是 Christian 的评论+1:为什么不' Java 允许重写静态方法吗?

如果它是非静态的并且该方法不是私有的或最终的,您可以对该类进行子类化,提供您自己的重写方法,然后使用它。

No - not with pretty much copying the class and replacing it there. Otherwise, a better alternative may be +1 for Christian's comment: Why doesn't Java allow overriding of static methods?

If it was non-static and the method wasn't private or final, you could subclass the class, provide your own overridden method, and use that.

马蹄踏│碎落叶 2025-01-04 16:12:47

不,你不能覆盖它。静态方法存在此类问题,例如在编写单元测试时。

No, you can't override it. Static methods have these kinds of problems, for instance, when writing unit tests.

猛虎独行 2025-01-04 16:12:47

你唯一的选择就是更换课程。您可以编译不同的版本并将其放在类路径的前面或替换原始副本。

Java 不支持静态方法的多态性(您可以隐藏但不能覆盖静态方法)因此,实用程序类通常被设为 final 来明确这一点。为了实现这一点,我使用一个没有实例的enum

public enum Util {;
    public static ReturnType method(ParameterTypes... args) {
    }
}

You only option is to replace the class. You can compile a different version and make it earlier in the class path or replace the original copy.

Java doesn't support polymorphism for static methods (you can hide but not override a static method) For this reason, Utility classes are often made final to make this clear. To implement this I use an enum with no instances.

public enum Util {;
    public static ReturnType method(ParameterTypes... args) {
    }
}
述情 2025-01-04 16:12:47

不幸的是,没有。 StackOverflow 上的这个答案解释了原因。您需要创建一个包装类。大多数语言都是这种情况,在链接中再次进行了解释。

Unfortunately, no. This answer on StackOverflow explains why that is. You would need to create a wrapper class. This is the case for most languages, again explained in the link.

一袭水袖舞倾城 2025-01-04 16:12:47

通过获取库的源代码来修复代码并重新创建 jar 文件。尝试使用 JAD(与 FrontEndPlus 一起)将 .class 文件反编译为 .java 文件。

如果调用在您的代码中,那么您可以使用完全限定的 Utils 类名作为方法前缀。示例:{您的命名空间}.Utils.getFile() ..

Fix the code by getting the source code of the library and recreate the jar file. Try using JAD (along with FrontEndPlus) to decompile the .class files to .java files.

If the calls are in your code, then you can use your fully qualified Utils class name prefixing the method. Example: {your namespace}.Utils.getFile() ..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文