从包外部使用package-private构造函数访问最终的静态类

时间:2018-06-17 09:28:34

标签: java mocking

我有一个我无法修改的类,如下所示:

public class ValueSupplier {

public static final class Value {
    private final Long id;

    private final String value1;
    private final String value2;

    Value(Long id, String value1, String value2) {
        this.id = id;
        this.value1 = value1;
        this.value2 = value2;
    }

    // getters omitted
}

无论如何,我可以在类所在的包之外使用静态 Value 类而不使用反射吗?我想不值得问。 List是从ValueSupplier中的某个方法返回的,并且想要模拟该方法但不能返回List,因为我无法访问该包。

如果使用反射 - 最简单,最明确的解决方案是什么?

编辑: 我的意思是通过构造函数创建它的实例 - 这是我的问题。

1 个答案:

答案 0 :(得分:1)

如果无法修改嵌套类,则只能使用Reflection API。

主要思想是获取构造函数(1),通过AccessibleObject#setAccessible使其可访问(2)并调用它(3)。

import <package>.ValueSupplier;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ClassFromAnotherPackage {

    @SuppressWarnings("unchecked")
    public void methodFromAnotherPackage()
            throws IllegalAccessException, InvocationTargetException, InstantiationException {

        final Constructor<?>[] constructors = ValueSupplier.Value.class.getDeclaredConstructors();

        if (constructors.length > 0) {
            final Constructor<ValueSupplier.Value> constructor = (Constructor<ValueSupplier.Value>) constructors[0]; // 1
            constructor.setAccessible(true); // 2
            final ValueSupplier.Value value = constructor.newInstance(1L, "str1", "str2"); // 3
        }

    }

}