【问题标题】:Can I remove a method from a class instance in java?我可以从java中的类实例中删除方法吗?
【发布时间】:2016-10-02 16:05:04
【问题描述】:

假设我有一个名为“Foo”的类,其中包含一些方法:

 public class Foo{
    public void a(){
       //stuff
    }

    public void b(){
       //stuff
    }
 }

我有一个 Foo 的实例: Foo instanceOfFoo = new Foo();

我可以从“instanceOfFoo”中删除方法“a”吗?

【问题讨论】:

  • 能否请您重新表述您的问题?如果你删除函数声明,假设它有 0 个引用,什么都不会发生
  • 删除是什么意思?如果有人在该实例上调用该方法会发生什么?
  • 我投票结束这个问题,因为这个问题显然没有意义。
  • 这似乎是一个 XY 问题。你想用这种方法达到什么目的?正如答案所指出的,如果不在运行时修改字节码,这是不可能的。或许你可以用一种不太复杂的方法来实现你的目标?

标签: java methods reflection


【解决方案1】:

您无法删除方法,除非更改字节码并破坏代码的“契约”,但您可以扩展类并让子类的方法覆盖在调用时抛出 UnsupportedOperationException。子类也应该弃用该方法,并在其 javadoc 中解释其背后的基本原理,以及在其位置使用什么。

这会改变类的契约,但是以一种更负责任的方式说摆弄字节码。

例如:

public class Foo {
    public void a() {
        // stuff
    }

    public void b() {
        // stuff
    }
}

public class FooChild extends Foo {
    /**
     * @deprecated: This method should no longer be used and will throw an exception
     */
    @Override
    @Deprecated
    public void a() {
        String text = "The method a is no longer supported";
        throw new UnsupportedOperationException(text);
    }
}

【讨论】:

    【解决方案2】:

    简短回答:不,不是。

    长答案:如果您可以控制用于加载Foo类的ClassLoader,则可以拦截加载Foo类的请求,并在加载前使用ASMJavassist修改类的字节码它。

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2018-10-14
      • 2012-12-15
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多