有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用packageprivate构造函数从包外部访问最终静态类

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

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
}

我是否可以在类所在的包之外使用静态类,而不使用反射?我想不是,但值得一问。列表是从ValueSupplier中的某个方法返回的,希望模拟该方法,但无法返回列表,因为我没有访问该包的权限

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

编辑: 我的意思是通过构造函数创建一个实例——这是我的问题


共 (1) 个答案

  1. # 1 楼答案

    如果不能修改嵌套类,反射API是唯一的选项

    其基本思想是获取一个构造函数(1),通过^{}访问它(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
            }
    
        }
    
    }