java - 如何使用反射机制以默认可见性调用驻留在基类中的公共(public)方法?

标签 java oop reflection method-invocation class-visibility

本题涉及java编程语言的反射机制。

我有一个界面:

package A;

public interface MyInterface {

    public boolean doSomething(Object... parameters);
}

我有几个这个接口(interface)的实现类。这里有一些例子:

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.

    ...
}

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

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

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

在实例化和初始化具体实现类的实例时,我会使用反射机制。为此,我有一个实用程序类(位于单独的包中),我必须在其中指定所需的类名、哪个字段获取哪个值(即,然后将查找适当的设置方法)以及设置方法的顺序被调用。

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

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

我发现的一种解决方法是更改​​基类的可见性(默认 -> 公共(public))。问题是,有没有办法在保持可见性(默认)的同时,仍然通过反射机制调用setter方法?

最佳答案

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

AccessibleObject.setAccessible(boolean);

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

关于java - 如何使用反射机制以默认可见性调用驻留在基类中的公共(public)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070121/

相关文章:

javascript - 在 JavaScript 中用字符串调用类

javascript - 条件后自执行函数传递对象

reflection - 如何从 Rust 函数内部检查它是直接调用还是由 C# 代码中的 Invoke() 调用?

Java HttpUrlConnection 抛出连接被拒绝

java - IntelliJ 调试器未在 Maven Java Google App Engine 项目中遇到断点(Eclipse 有效)

python - 将类对象追加到列表中

java - BeanUtils.copyProperties 将 Integer null 转换为 0

c# - 如何获取属性的接口(interface)/基类型祖先的所有属性?

java - Java 的 switch-yield 语法的某些模式中的编译错误

java - 如何让 Spring JPA、Hibernate 和 OSGi 发挥出色?