我有一个第三方的框架工作,事实证明,我需要换一些物体作为代表到我的课之一。

class Foo { // 3rd party class.
    protected void method() {}
}

class FooWrapper extends Foo {
    private Foo mDelegate;

    public FooWrapper(Foo inDelegate) {
        mDelegate = inDelegate;
    }

    protected void method() {
        mDelegate.method(); // error can't access protected method() of mDelegate
    }
}

所以存在这样的问题。我需要委托此方法到内部的对象,但它的保护,因此不能访问。

这方法来解决这个特定问题的任何想法?这是用于Java 1.3。

有帮助吗?

解决方案

为什么要构建美孚的一个单独的实例? FooWrapper已经是一个Foo。

class Foo {
    protected void method() {}
}

class FooWrapper extends Foo {

    protected void method() {
        super.method();
    }
}

修改:如果你真的必须有单独的实例,一种方法(尽管略有难看)是使用反射:

public class Foo {

    protected void method() {
        System.out.println("In Foo.method()");
    }
}

public class FooWrapper extends Foo {

    private Foo foo;

    public FooWrapper(Foo foo) {
        this.foo = foo;
    }

    public void method() {
        try {
            Method m = foo.getClass().getDeclaredMethod("method", null);
            m.setAccessible(true);
            m.invoke(foo, null);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

EDIT2:根据您在下面的评论,有两个子类的Foo,一个是简单地提供的保护方法的公共版本,和一个有覆盖所有的重要方法。第一个会看,准确地扮演一个富,第二个可以做你需要做什么:

public class Foo {

    protected void method() {
        System.out.println("In Foo.method()");
    }
}

public class DelegateFoo extends Foo {

    public void method() {
        super.method();
    }
}

public class FooWrapper extends Foo {

    private DelegateFoo foo;

    public FooWrapper(DelegateFoo foo) {
        this.foo = foo;
    }

    public void method() {
        foo.method();
        /* extra logic here */
    }
}

其他提示

我所做的,当我已经在一个像这样的情况,它的不是很好,但它的工作原理,是建立在同一个包为Foo一个PublicFoo(但在你的源),已经将其扩展符,和重写保护的方法和把它公开。

现在,FooWrapper可以扩展PublicFoo,做任何你想要的。

请注意,但是,如果原来的jar签字盖章,你会需要删除的签名,然后才能进行部署。 (你可以进入罐中的清单目录,只需删除证书)

好了,如果它有它的特性(无论是干将或公共变量)公共访问,您可以创建一个拷贝构造函数:

public FooWrapper(Foo inDelegate) {
    this.property1 = inDelegate.getProperty1();
    this.property2 = inDelegate.getProperty2();
    // for every property
}

如果属性是对象...伟大的,甚至更好,因为这时您通过原始对象访问时,也将出现任何改变! (也就是说,直到更换那些对象,你必须为不变类像字符串中的一个。)

一个子类应具有以一个访问超类的保护的方法。

如果你只需要调用super.method(),而不是mDelegate.method()的,它会去;你们都包裹在父类的的实例吧。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top