java - 从包外部使用包私有(private)构造函数访问最终静态类

标签 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,因为我无权访问该包。

如果使用反射 - 最简单、最清晰的解决方案是什么?

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

最佳答案

如果嵌套类无法修改,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
        }

    }

}

关于java - 从包外部使用包私有(private)构造函数访问最终静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895350/

相关文章:

java - 使用 MockitoAnnotations 时不会调用 @PostConstruct

python - 模拟 python-gitlab 方法的返回值时遇到问题

java - 用于分析实例组合的设计模式?

java - Java中有 "smart pointers"吗?

java:读取大型二进制文件

java - 如何在HTTP客户端apache上编写测试?

python - 模拟在方法调用后更改实例变量的 python 类?

python - 在 python 中对 "FileNotFoundError"进行单元测试

java - 为什么每个 Fragment 中都需要有一个公共(public)的空构造函数?

java:将特定版本的jar加载到我的类中