Доступ к конечному статическому классу с помощью конструктора private-пакета извне пакета
У меня есть класс, который я не могу изменить, который выглядит следующим образом:
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 ответ
Если вложенный класс не может быть изменен, Reflection API - единственный вариант.
Основная идея - получить конструктор (1), сделать его доступным (2) через AccessibleObject#setAccessible
и вызвать его (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
}
}
}