Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用反射机制调用驻留在具有默认可见性的基类中的公共方法?_Java_Oop_Reflection_Method Invocation_Class Visibility - Fatal编程技术网

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

Java 如何使用反射机制调用驻留在具有默认可见性的基类中的公共方法?,java,oop,reflection,method-invocation,class-visibility,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 Ob

这个问题涉及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;
    }
}

(编辑)作为旁注(这可能与反映机制相关的问题无关):

我正在实现一个复杂的规则集。此规则集的一个缺点是对象之间存在大量的相互依赖关系。因此,需要定义接口的一般行为。当执行规则集的一部分时,必须考虑另一个尚未执行的部分的行为。

接口的不同实现需要不同的资源/对象才能正常工作。为了减少重复代码,我使用抽象父类。这些抽象类不会在其包之外使用

在实例化和初始化具体实现类的实例时,我求助于反射机制。为此,我有一个实用程序类(位于一个单独的包中),其中我必须指定所需的类名、哪个字段获得哪个值(即,将查找相应的setter方法)以及setter方法的调用顺序

我有两个不同的开发环境,每个环境上安装了不同版本的java(1.5.x和1.6.x)。这主要用于交叉检查实现的行为

实例化具体实现类的实例在这两种环境中都有效。但是 使用较旧的java版本初始化失败。不知何故,基类的公共setter方法(基类具有默认可见性)无法访问。较新的java版本在访问setter方法时没有问题


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

取决于您可以使用的安全限制

AccessibleObject.setAccessible(boolean);
(AccessibleObject是由字段、方法、构造函数实现的接口)。在反射调用之前,只需调用method.setAccessible(true);在reflections对象上,除非SecurityManager抛出异常,否则您应该不会有问题。

提供可见性有限的接口(或抽象类)听起来有点奇怪。有点像用看不见的墨水画地图。
AccessibleObject.setAccessible(boolean);