假设我有一个名为'Foo'的类,它有一些方法:
public class Foo{
public void a(){
//stuff
}
public void b(){
//stuff
}
}
,我有一个实例Foo:Foo instanceOfFoo = new Foo();
我可以从'instanceOfFoo'中删除方法'a'吗?
你不能删除一个方法,除非改变字节码并破坏代码的"契约",但你可以扩展类,并让子类的方法重写在调用时抛出一个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);
}
}
简短的回答:不,不是真的。
长回答:如果你可以控制ClassLoader
被用来加载Foo
类,你可以拦截加载Foo类的请求,并在加载它之前使用ASM或Javassist修改类的字节码