private Parser getParser()

in 3-extensions/serialization/dubbo-samples-protobuf-json/protobuf-json-serialization-implement/src/main/java/org/apache/dubbo/sample/protobuf/serialization/utils/ProtobufUtils.java [111:136]


    private Parser<?> getParser(Class clazz)
            throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Parser<?> parser = class2ParserMap.get(clazz);
        if (parser == null) {
            synchronized (class2ParserMapLock) {
                parser = class2ParserMap.get(clazz);
                if (parser == null) {
                    try {
                        Method parserMethod = clazz.getMethod("parser");
                        parser = (Parser<?>) parserMethod.invoke(clazz);
                    } catch (NoSuchMethodException ex) {
                        // try to find from PARSER field
                        try {
                            Field parserField = clazz.getField("PARSER");
                            parser = (Parser<?>) parserField.get(clazz);
                        } catch (NoSuchFieldException ex2) {
                            // throw NoSuchMethodException instead of NoSuchFieldException
                            throw ex;
                        }
                    }
                    class2ParserMap.put(clazz, parser);
                }
            }
        }
        return parser;
    }