如何使用反射机制来调用驻留在具有默认可见性的基类中的公共方法



这个问题涉及到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方法时没有问题。

我发现的一个解决方法是改变基类的可见性(default -> public)。问题是,是否有一种方法可以保持可见性(默认),并且仍然使用反射机制调用setter方法?

您可以使用

AccessibleObject.setAccessible(boolean);

(AccessibleObject是由Field, Method, Constructor实现的接口)。在你的反射调用之前,只需调用method.setAccessible(true);

相关内容

  • 没有找到相关文章

最新更新