Java 如何使用反射机制调用驻留在具有默认可见性的基类中的公共方法?
这个问题涉及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
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);