【问题标题】:Adding a method to Java class in different file without extending the class在不扩展类的情况下向不同文件中的 Java 类添加方法
【发布时间】:2013-05-16 16:52:11
【问题描述】:
package com.companyxyz.api.person;

public class Man {
    public var1;
    public var2;
    ...
    private static void createAuth() {
    ...
    }
    // public methods go here
    ...
}

我想创建一个新的公共方法来访问私有方法,createAuth,但在不同的文件中。有没有办法创建这个新方法而无需编写或通过扩展类访问它?

谢谢。

【问题讨论】:

标签: java class function methods extends


【解决方案1】:

没有。您不能从其他类访问私有方法。因为它是……私人的。

【讨论】:

  • 我明白这一点。我想通过在不触及原始文件的情况下添加新方法来“继续” Man 类。
  • 正如 Duncan Jones 所说,您可以使用反射,但这是另一回事。
【解决方案2】:

任何外部类(包括子类)都无法访问私有方法。

一种解决方法可能是使用反射,但由于多种原因(脆弱性、性能问题、破坏封装等),这不是通常推荐的方法。

【讨论】:

  • 尽管你打破了成员变量的封装,但反射也不是很安全——你要使用的大多数方法都会抛出大量异常(很难正确处理)并且安全管理员(如果存在)也可以否决这些操作。
【解决方案3】:

在 Java 中没有干净且推荐的通用方法来执行此操作。 private 是私人的。

但您没有说明为什么要这样做以及具体的限制是什么。因此,我将两个选项混合在一起:

  • 您可以反编译Man 的类文件,设置您想要保护或公开的所有内容并重新编译(并重新打包成一个jar 文件)。也许不需要反编译,也许对类文件进行一些位操作也可以完成这项工作。

  • 您可以使用字节码操作库编写自定义ClassLoader,以在运行时修改类的字节码。然后你还可以为你想要的东西添加额外的访问路径。但请注意,这是非常高级/复杂的东西。

这两种方式都不是你可以使用/不应该用于普通应用程序或常用框架的。

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2021-12-10
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多