我想覆盖第三方,开源决赛类的非最终方法。
final class A
{
void put(obj a)
{...}
obj get()
{...}
}
请告诉我如何覆盖get()
和put()
方法,但仍然保留此类的其他行为和功能。
答案 0 :(得分:13)
它是开源的:分叉它,并使该类非最终。
如果不将其作为非最终版本,您将无法扩展它。
答案 1 :(得分:4)
如果你的类有一个已定义的接口,其中定义了put和get方法,那么你可能想尝试代理该类。
最简单的方法是创建这样的东西:
public interface CommonInterface {
void put(); Object get();
}
final class A implements CommonInterface
{
void put(obj a)
{...}
obj get()
{...}
}
public class ProxyToA implements CommonInterface{
private A a;
void put(Object a){
// your override functionality
}
Object get(){
// same here
}
void otherAStuff(){
a.otherAStuff();
}
}
然后只需使用CommonInterface并代理您的对象。或者您可以使用JDK代理,javassist等
答案 2 :(得分:1)
您无法扩展final
课程。根据Java规范。
答案 3 :(得分:0)
你一定要试着找出为什么这个班级是最终的。如果你能够说服自己可以做到这一点,另一个选择是使用AspectJ来改变这两种方法的行为。
AspectJ 允许您修改特定方法的行为。它甚至可以为private
方法执行此操作 - 安全性约束允许 - 以及访问和分配类的私有字段。
答案 4 :(得分:0)
简短的回答是,您无法覆盖这些方法,因为您无法扩展该类。你有什么打算通过覆盖来获取get和put方法?如果您要为这些方法添加一些功能,可以创建另一个包含此类的类。