这个问题涉及java编程语言的反射机制。
我有一个界面:
package A;
public interface MyInterface {
public boolean doSomething(Object... parameters);
}
我有这个接口的几个实现类。这里有一些例子:
package B;
import A.*;
abstract class BaseImplementation implements MyInterface {
private Object field;
protected BaseImplementation() {
super();
}
public void setField(Object aField) {
field = aField;
}
public Object getField() {
return field;
}
}
package B;
import A.*;
public class ConcreteImplementation extends BaseImplementation {
public ConcreteImplementation() {
super();
}
...
// The concrete implementation provides an implementation for all
// inherited abstract methods. Apart from this no other methods
// are overridden.
// This concrete class provides accessor methods for all of its own
// private fields.
...
}
(已编辑)作为旁注(这可能与有关反射机制的问题无关):
我正在实施一个复杂的规则集。这个规则集的一个缺点是对象之间有很多相互依赖关系。因此需要定义接口的一般行为。在实现规则集的一个部分时,您必须考虑另一个尚未实现的部分的行为。
接口的不同实现需要不同的资源/对象才能正常工作。为了减少重复代码,我使用抽象父类。这些抽象类不在其包之外使用。
在实例化和初始化具体实现类的实例时,我求助于反射机制。为此,我有一个实用程序类(位于单独的包中),我必须在其中指定所需的类名,哪个字段获取哪个值(即,然后将查找适当的 setter 方法)以及 setter 方法的顺序被称为。
我有两个不同的开发环境,每个环境都安装了不同版本的 java(1.5.x 和 1.6.x)。这主要用于交叉检查实现的行为。
实例化具体实现类的实例适用于两种环境。但是较旧的 java 版本初始化失败。不知何故,无法访问基类的公共 setter 方法(基类具有默认可见性)。较新的 java 版本在访问 setter 方法方面没有问题。
我发现的一种解决方法是更改基类的可见性(默认 -> 公共)。问题是,有没有办法保持可见性(默认)并仍然使用反射机制调用 setter 方法?