From 891c521528beb57fef0c362f535e3e355b52cd1c Mon Sep 17 00:00:00 2001 From: Jiayu Liu Date: Sun, 8 May 2022 13:31:21 +0800 Subject: THRIFT-5543: add type parameter to java lib field metadata (#2552) * add type parameter to java lib field metadata * reduce number of exceptions --- .../org/apache/thrift/meta_data/FieldMetaData.java | 30 +++++++++------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/java/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java b/lib/java/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java index b78919385..3a7c1e24f 100644 --- a/lib/java/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java +++ b/lib/java/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java @@ -22,6 +22,7 @@ package org.apache.thrift.meta_data; import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.apache.thrift.TBase; import org.apache.thrift.TFieldIdEnum; @@ -42,7 +43,8 @@ public class FieldMetaData implements java.io.Serializable { public final byte requirementType; public final FieldValueMetaData valueMetaData; private final Map fieldAnnotations; - private static final Map, Map> + private static final ConcurrentMap< + Class, Map> structMap = new ConcurrentHashMap<>(); public FieldMetaData(String name, byte req, FieldValueMetaData vMetaData) { @@ -68,8 +70,8 @@ public class FieldMetaData implements java.io.Serializable { return Collections.unmodifiableMap(fieldAnnotations); } - public static void addStructMetaDataMap( - Class sClass, Map map) { + public static , F extends TFieldIdEnum> void addStructMetaDataMap( + Class sClass, Map map) { structMap.put(sClass, map); } @@ -82,29 +84,21 @@ public class FieldMetaData implements java.io.Serializable { * to {@link FieldMetaData#addStructMetaDataMap(Class, Map)} from a different thread during * static initialization of the Thrift class is possible. */ - public static Map getStructMetaDataMap( - Class sClass) { + public static , F extends TFieldIdEnum> + Map getStructMetaDataMap(Class sClass) { // Note: Do not use synchronized on this method declaration - it leads to a deadlock. // Similarly, do not trigger sClass.newInstance() while holding a lock on structMap, // it will lead to the same deadlock. // See: https://issues.apache.org/jira/browse/THRIFT-5430 for details. if (!structMap.containsKey(sClass)) { // Load class if it hasn't been loaded try { - sClass.newInstance(); - } catch (InstantiationException e) { + sClass.getDeclaredConstructor().newInstance(); + } catch (ReflectiveOperationException e) { throw new RuntimeException( - "InstantiationException for TBase class: " - + sClass.getName() - + ", message: " - + e.getMessage()); - } catch (IllegalAccessException e) { - throw new RuntimeException( - "IllegalAccessException for TBase class: " - + sClass.getName() - + ", message: " - + e.getMessage()); + e.getClass().getSimpleName() + " for TBase class: " + sClass.getName(), e); } } - return structMap.get(sClass); + //noinspection unchecked + return (Map) structMap.get(sClass); } } -- cgit v1.2.1