题
我有一个第三方的框架工作,事实证明,我需要换一些物体作为代表到我的课之一。
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()的,它会去;你们都包裹在父类的和的实例吧。
不隶属于 StackOverflow