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

时间:2011-01-27 11:51:34

标签: java

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

  1. 使用反射(完成)
  2. 查找方法
  3. 将方法访问修饰符更改为public和static。 (如何?)
  4. 执行此方法时没有任何现有实例(如何?)
  5. 反射有没有选择呢?

6 个答案:

答案 0 :(得分:3)

不,这完全不可能,也没有任何意义。实例方法可以访问(并且通常使用)实例变量。应该怎么做一个典型的set或get方法已经“静态”可能吗?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

即使你使用的工具可以让你改变一个类(比如BCEL),你仍然无法实现任何目标,因为(除了所有的小警告)你将方法从实例方法改为静态,所有代码调用它将抛出一个NoSuchMethodError。原因是调用静态/实例方法使用两个不同的操作码。

答案 3 :(得分:0)

没有。你不能用反射改变一个类。你可以检查它。

答案 4 :(得分:0)

我认为这不可能。

如果你的方法使用'this'引用,那将是一个未定义的行为。

答案 5 :(得分:0)

正如所有人都说的那样糟糕,不应该这样做。

但是,如果你必须实现这个目标并且你已经给出了理由,那么我可能想尝试不同的东西来实现这一点。
我可能会创建一个单例类并提供一个静态方法(facade)来访问所需的API方法,并始终确保所有其他类使用此单例类方法来访问API方法。