假设我有一个名为' Foo'的课程,有一些方法:
public class Foo{
public void a(){
//stuff
}
public void b(){
//stuff
}
}
我有一个Foo的例子:
Foo instanceOfFoo = new Foo();
我可以删除方法' a'从' instanceOfFoo'?
答案 0 :(得分:2)
你不能删除一个方法,不是不改变字节代码和破坏代码"合同",但是你可以扩展课程并让孩子上课'如果调用,则方法覆盖抛出Javassist。子类也应该弃用该方法,并在其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);
}
}
答案 1 :(得分:1)
简短回答:不,不是真的。
答案很长:如果您可以控制用于加载ClassLoader
类的Foo
,则可以拦截加载Foo类的请求并使用ASM或{{3}在加载之前修改类的字节码。