Java扩展最终类

时间:2012-10-03 17:17:28

标签: java oop

我想覆盖第三方,开源决赛类的非最终方法。

final class A 
{
    void put(obj a)
    {...}

    obj get()
    {...}
}

请告诉我如何覆盖get()put()方法,但仍然保留此类的其他行为和功能。

5 个答案:

答案 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方法?如果您要为这些方法添加一些功能,可以创建另一个包含此类的类。