我有一个无法修改的类,如下所示:
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/