如何使任何Java方法在运行时保持静态?

如何使任何Java方法在运行时保持静态?,java,Java,我想知道是否有任何方法可以实现以下目标 使用反射查找方法(完成) 将“方法访问”修改器更改为“公共和静态”。(怎么做?) 在没有任何现有实例的情况下执行此方法(如何执行?) 反射是否有这样做的选项?这没有任何意义。非静态方法之所以是非静态的,是因为它需要访问特定于类的特定实例的成员数据。如何将其转换为静态?这没有任何意义。非静态方法之所以是非静态的,是因为它需要访问特定于类的特定实例的成员数据。如何将其转换为静态?不,这是完全不可能的,毫无意义。实例方法可以访问(通常使用)实例变量。例如,“静态

我想知道是否有任何方法可以实现以下目标

  • 使用反射查找方法(完成)
  • 将“方法访问”修改器更改为“公共和静态”。(怎么做?)
  • 在没有任何现有实例的情况下执行此方法(如何执行?)

  • 反射是否有这样做的选项?

    这没有任何意义。非静态方法之所以是非静态的,是因为它需要访问特定于类的特定实例的成员数据。如何将其转换为静态?

    这没有任何意义。非静态方法之所以是非静态的,是因为它需要访问特定于类的特定实例的成员数据。如何将其转换为静态?

    不,这是完全不可能的,毫无意义。实例方法可以访问(通常使用)实例变量。例如,“静态化”的典型set或get方法应该做什么?

    不,这是完全不可能的,毫无意义。实例方法可以访问(通常使用)实例变量。例如,一个典型的set或get方法被“设置为静态”时,应该做什么?

    否。您不能使用反射更改类。您可以检查它。

    不。您不能使用反射更改类。你可以检查一下。

    我认为这是不可能的


    如果您的方法使用“this”引用,那么这将是一种未定义的行为。

    我认为这是不可能的


    如果您的方法使用了“this”引用,那将是一种未定义的行为。

    即使您使用了允许您更改类的工具(如BCEL),您仍然不会取得任何成果,因为(除了所有小的警告)当您将方法从实例方法更改为静态方法时,所有调用它的代码都将抛出一个
    NoSuchMethodError
    。原因是调用静态/实例方法使用了两种不同的操作码。

    即使您使用了允许您更改类的工具(如BCEL),您仍然不会取得任何成果,因为(除了所有小的警告)当您将方法从实例方法更改为静态方法时,所有调用它的代码都将抛出一个
    NoSuchMethodError
    。原因是调用静态/实例方法使用两种不同的操作码。

    正如所有人所说,这是不好的,不应该这样做。

    但是,如果您必须实现这一点,并且您已经给出了原因,那么我可能会尝试一些不同的方法来实现这一点。

    我可能会创建一个单例类,并提供一个静态方法(facade)来访问所需的API方法,并始终确保所有其他类都使用此单例类方法来访问API方法。

    正如所有人所说,这是不好的,不应该这样做。

    但是,如果您必须实现这一点,并且您已经给出了原因,那么我可能会尝试一些不同的方法来实现这一点。

    我可能会创建一个单例类,并提供一个静态方法(facade)来访问所需的API方法,并始终确保所有其他类都使用此单例类方法来访问API方法。

    我讨厌人们像我现在要做的那样回应,但是,你为什么要这样做?@Viktor:我想“为什么?”是一个完全合理的评论;我有一个API,我需要执行API中某个类的方法。这个类是final,对象创建过程非常昂贵(我甚至无法访问所有必需的资源)。所以,我想知道这是否是一个选项。很可能这个方法是非静态的,因为它使用了一些实例变量,因此在没有实例的情况下不可能调用它。我讨厌人们像我现在要做的那样回应,但是,你为什么要这样做?@Viktor:我认为“为什么?”是一个非常合理的评论。@vector;我有一个API,我需要执行API中某个类的方法。这个类是final,对象创建过程非常昂贵(我甚至无法访问所有必需的资源)。所以,我想知道这是否是一个选项。很可能这个方法是非静态的,因为它使用了一些实例变量,因此在没有实例的情况下不可能调用它。此外,您不能自动使方法成为静态的。静态方法不能调用其他非静态方法或变量。因此,实际上为了安全起见,您必须将所有方法更改为静态。但在这种情况下,你能实现什么?仅创建实例并调用其非静态方法也会产生相同的效果。@AlexR:>>此外,您不能使方法成为静态的automatically@AlexR这就是我委婉地称之为“小警告”的东西。但你们是对的,有一千个理由说明这个方法不起作用,而且你们不能自动使这个方法成为静态的。静态方法不能调用其他非静态方法或变量。因此,实际上为了安全起见,您必须将所有方法更改为静态。但在这种情况下,你能实现什么?仅创建实例并调用其非静态方法也会产生相同的效果。@AlexR:>>此外,您不能使方法成为静态的automatically@AlexR这就是我委婉地称之为“小警告”的东西。但你是对的,有一千个理由说明这不起作用。