2

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

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

    obj get()
    {...}
}

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

4

5 回答 5

13

它是开源的:分叉它,并使类非最终。

如果不使其成为非最终版本,您将无法扩展它。

于 2012-10-03T17:18:27.680 回答
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 等。

于 2012-10-03T17:23:29.987 回答
1

你不能扩展final课程。根据 Java 规范。

于 2012-10-03T17:18:12.327 回答
0

您绝对应该尝试找出课程是最终课程的原因。如果您能够说服自己这样做是可以的,另一种选择是使用AspectJ来更改这两种方法的行为。

AspectJ允许您修改特定方法的行为。它甚至可以对private方法(允许安全约束)执行此操作,并访问和分配类的私有字段。

于 2012-10-03T17:23:39.983 回答
0

简短的回答是你不能重写方法,因为你不能扩展类。您打算通过覆盖来处理 get 和 put 方法吗?如果您正在寻找为这些方法添加一些功能,您可以创建另一个包含此类的类。

于 2012-10-03T17:23:59.417 回答