@@ -56,6 +56,10 @@ public class CommandModuleItem<T> extends AbstractModuleItem<T> {
5656
5757 private final Field field ;
5858
59+ private Class <T > type ;
60+ private Type genericType ;
61+ private boolean initialized = false ;
62+
5963 public CommandModuleItem (final ModuleInfo info , final Field field ) {
6064 super (info );
6165 this .field = field ;
@@ -75,16 +79,14 @@ public Parameter getParameter() {
7579
7680 @ Override
7781 public Class <T > getType () {
78- final Class <?> type =
79- GenericUtils .getFieldClasses (field , getDelegateClass ()).get (0 );
80- @ SuppressWarnings ("unchecked" )
81- final Class <T > typedType = (Class <T >) type ;
82- return typedType ;
82+ if (!initialized ) findTypes ();
83+ return type ;
8384 }
8485
8586 @ Override
8687 public Type getGenericType () {
87- return GenericUtils .getFieldType (field , getDelegateClass ());
88+ if (!initialized ) findTypes ();
89+ return genericType ;
8890 }
8991
9092 @ Override
@@ -220,4 +222,19 @@ private <D> D tValue(final String value, final Class<D> type) {
220222 return ConversionUtils .convert (value , saneType );
221223 }
222224
225+ /**
226+ * Helper method to initialize {@link #type} and {@link #genericType} in a
227+ * thread-safe way.
228+ */
229+ @ SuppressWarnings ("unchecked" )
230+ private synchronized void findTypes () {
231+ if (!initialized ) {
232+ final Class <?> untypedType = GenericUtils .getFieldClasses (field , getDelegateClass ()).get (0 );
233+ type = (Class <T >) untypedType ;
234+
235+ genericType = GenericUtils .getFieldType (field , getDelegateClass ());
236+ initialized = true ;
237+ }
238+ }
239+
223240}
0 commit comments