summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiayu Liu <Jimexist@users.noreply.github.com>2022-05-08 13:31:21 +0800
committerGitHub <noreply@github.com>2022-05-08 01:31:21 -0400
commit891c521528beb57fef0c362f535e3e355b52cd1c (patch)
tree2266ab306b5d5426a389b9024c5d05f542967d7b
parenteb62fa8d13f9860c4c877d0252e67ef21b013488 (diff)
downloadthrift-891c521528beb57fef0c362f535e3e355b52cd1c.tar.gz
THRIFT-5543: add type parameter to java lib field metadata (#2552)
* add type parameter to java lib field metadata * reduce number of exceptions
-rw-r--r--lib/java/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java30
1 files 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<String, String> fieldAnnotations;
- private static final Map<Class<? extends TBase>, Map<? extends TFieldIdEnum, FieldMetaData>>
+ private static final ConcurrentMap<
+ Class<? extends TBase>, Map<? extends TFieldIdEnum, FieldMetaData>>
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<? extends TBase> sClass, Map<? extends TFieldIdEnum, FieldMetaData> map) {
+ public static <T extends TBase<T, F>, F extends TFieldIdEnum> void addStructMetaDataMap(
+ Class<T> sClass, Map<F, FieldMetaData> 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<? extends TFieldIdEnum, FieldMetaData> getStructMetaDataMap(
- Class<? extends TBase> sClass) {
+ public static <T extends TBase<T, F>, F extends TFieldIdEnum>
+ Map<F, FieldMetaData> getStructMetaDataMap(Class<T> 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<F, FieldMetaData>) structMap.get(sClass);
}
}