Доступ к конечному статическому классу с помощью конструктора 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
        }

    }

}
Другие вопросы по тегам