मैं कक्षाओं से 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 विधि पहुंच योग्य क्यों नहीं है?

1
Jin Kwon 28 जिंदा 2020, 12:31

2 जवाब

सबसे बढ़िया उत्तर

देखें isAccessible के लिए दस्तावेज़:

यह विधि बहिष्कृत है क्योंकि इसका नाम इंगित करता है कि यह जांचता है कि क्या परावर्तित वस्तु पहुंच योग्य है जब यह वास्तव में इंगित करता है कि जावा भाषा अभिगम नियंत्रण के लिए चेक दबा दिए गए हैं या नहीं। यह विधि false परावर्तित वस्तु पर वापस आ सकती है जो कॉलर के लिए सुलभ है। यह जांचने के लिए कि क्या यह प्रतिबिंबित वस्तु पहुंच योग्य है, इसे canAccess(Object).

(मेरा जोर।)

4
T.J. Crowder 28 जिंदा 2020, 12:40

जावा प्रतिबिंब एपीआई के साथ, आप सुलभ ध्वज सेट करके विधियों की पहुंच को ओवरराइड कर सकते हैं। यह method.setAccessible(true) द्वारा किया जा सकता है।

अब isAccessible() विधि वह नहीं है जो आपको लगता है कि यह करता है, लेकिन यह केवल जांचता है, अगर मानक जावा एक्सेस चेक वर्तमान में ओवरराइड हैं।

इसका मतलब यह है कि यदि मानक एक्सेस संशोधक इसे अनुमति देते हैं तो आप निश्चित रूप से प्रतिबिंब के साथ विधि का आह्वान कर सकते हैं। अन्यथा, आपको सुलभ ध्वज सेट करना होगा।

1
QBert 28 जिंदा 2020, 12:38