Почему метод publi c stati c недоступен? - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь отразить parse(CharSequence, DateTimeFormatter) методы из классов, каждый из которых расширяет класс TemporalAccessor.

    private static final Map<Class<?>, MethodHandle> PARSE_HANDLES = synchronizedMap(new HashMap<>());

    static <T extends TemporalAccessor> MethodHandle parseMethodHandle(final Class<T> clazz) {
        if (clazz == null) {
            throw new NullPointerException("clazz is null");
        }
        return PARSE_HANDLES.computeIfAbsent(clazz, k -> {
            try {
                final Method method = clazz.getMethod("parse", CharSequence.class, DateTimeFormatter.class);
                log.debug("method: {}, {}", method, method.isAccessible());
                // i don't understand; public static method is not accessible? yet it isn't.
                assert method.isAccessible(); // NOT GOOD with UTs
                return MethodHandles.lookup().unreflect(method);
            } catch (final ReflectiveOperationException roe) {
                throw new RuntimeException(roe);
            }
        });
    }

С классом YearMonth я получил это.

method: public static java.time.YearMonth java.time.YearMonth.parse(java.lang.CharSequence,java.time.format.DateTimeFormatter), false

Почему метод public static недоступен?

Ответы [ 2 ]

4 голосов
/ 28 января 2020

См. документацию для isAccessible:

Этот метод устарел, поскольку его имя намекает на то, что он проверяет, доступен ли отраженный объект, когда фактически указывает, проверяет ли он для Java контроль доступа к языку подавлен. Этот метод может возвращать false для отраженного объекта, который доступен вызывающей стороне. Чтобы проверить, доступен ли этот отраженный объект, следует использовать canAccess(Object).

(мой акцент.)

1 голос
/ 28 января 2020

С помощью Java Reflection API вы можете переопределить доступность методов, установив флаг available . Это может быть выполнено с помощью method.setAccessible(true).

Теперь метод isAccessible() делает не то, что вы думаете, а просто проверяет, не отменены ли в настоящее время стандартные проверки доступа java.

Это означает, что вы, конечно, можете вызывать метод с отражением, если это позволяют стандартные модификаторы доступа. В противном случае вы должны были установить флаг available .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...