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

时间:2011-11-09 19:00:56

标签: java oop reflection method-invocation class-visibility

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

我找到的一个解决方法是更改​​基类的可见性(默认 - > public)。问题是,有没有办法保持可见性(默认)并仍然使用反射机制调用setter方法?

1 个答案:

答案 0 :(得分:1)

根据您的安全限制,您可以使用

AccessibleObject.setAccessible(boolean);

(AccessibleObject是Field,Method,Constructor实现的接口)。在您的反射调用之前,只需调用method.setAccessible(true);在Reflections对象上,除非SecurityManager抛出异常,否则你应该没问题。