@@ -68,6 +68,8 @@ protected void parseAndRegister(Reader reader, String featureName, Object locati
68
68
JSONParser parser = new JSONParser (reader );
69
69
Object json = parser .parse ();
70
70
parseClassArray (asList (json , "first level of document must be an array of class descriptors" ));
71
+ } catch (NoClassDefFoundError e ) {
72
+ throw e ;
71
73
} catch (IOException | JSONParserException e ) {
72
74
String errorMessage = e .getMessage ();
73
75
if (errorMessage == null || errorMessage .isEmpty ()) {
@@ -102,40 +104,44 @@ private void parseClass(Map<String, Object> data) {
102
104
for (Map .Entry <String , Object > entry : data .entrySet ()) {
103
105
String name = entry .getKey ();
104
106
Object value = entry .getValue ();
105
- if (name .equals ("name" )) {
106
- /* Already handled. */
107
- } else if (name .equals ("allDeclaredConstructors" )) {
108
- if (asBoolean (value , "allDeclaredConstructors" )) {
109
- registry .register (clazz .getDeclaredConstructors ());
110
- }
111
- } else if (name .equals ("allPublicConstructors" )) {
112
- if (asBoolean (value , "allPublicConstructors" )) {
113
- registry .register (clazz .getConstructors ());
114
- }
115
- } else if (name .equals ("allDeclaredMethods" )) {
116
- if (asBoolean (value , "allDeclaredMethods" )) {
117
- registry .register (clazz .getDeclaredMethods ());
118
- }
119
- } else if (name .equals ("allPublicMethods" )) {
120
- if (asBoolean (value , "allPublicMethods" )) {
121
- registry .register (clazz .getMethods ());
122
- }
123
- } else if (name .equals ("allDeclaredFields" )) {
124
- if (asBoolean (value , "allDeclaredFields" )) {
125
- registry .register (false , clazz .getDeclaredFields ());
126
- }
127
- } else if (name .equals ("allPublicFields" )) {
128
- if (asBoolean (value , "allPublicFields" )) {
129
- registry .register (false , clazz .getFields ());
107
+ try {
108
+ if (name .equals ("name" )) {
109
+ /* Already handled. */
110
+ } else if (name .equals ("allDeclaredConstructors" )) {
111
+ if (asBoolean (value , "allDeclaredConstructors" )) {
112
+ registry .register (clazz .getDeclaredConstructors ());
113
+ }
114
+ } else if (name .equals ("allPublicConstructors" )) {
115
+ if (asBoolean (value , "allPublicConstructors" )) {
116
+ registry .register (clazz .getConstructors ());
117
+ }
118
+ } else if (name .equals ("allDeclaredMethods" )) {
119
+ if (asBoolean (value , "allDeclaredMethods" )) {
120
+ registry .register (clazz .getDeclaredMethods ());
121
+ }
122
+ } else if (name .equals ("allPublicMethods" )) {
123
+ if (asBoolean (value , "allPublicMethods" )) {
124
+ registry .register (clazz .getMethods ());
125
+ }
126
+ } else if (name .equals ("allDeclaredFields" )) {
127
+ if (asBoolean (value , "allDeclaredFields" )) {
128
+ registry .register (false , clazz .getDeclaredFields ());
129
+ }
130
+ } else if (name .equals ("allPublicFields" )) {
131
+ if (asBoolean (value , "allPublicFields" )) {
132
+ registry .register (false , clazz .getFields ());
133
+ }
134
+ } else if (name .equals ("methods" )) {
135
+ parseMethods (asList (value , "Attribute 'methods' must be an array of method descriptors" ), clazz );
136
+ } else if (name .equals ("fields" )) {
137
+ parseFields (asList (value , "Attribute 'fields' must be an array of field descriptors" ), clazz );
138
+ } else {
139
+ throw new JSONParserException ("Unknown attribute '" + name +
140
+ "' (supported attributes: allDeclaredConstructors, allPublicConstructors, allDeclaredMethods, allPublicMethods, allDeclaredFields, allPublicFields, methods, fields) in defintion of class " +
141
+ clazz .getTypeName ());
130
142
}
131
- } else if (name .equals ("methods" )) {
132
- parseMethods (asList (value , "Attribute 'methods' must be an array of method descriptors" ), clazz );
133
- } else if (name .equals ("fields" )) {
134
- parseFields (asList (value , "Attribute 'fields' must be an array of field descriptors" ), clazz );
135
- } else {
136
- throw new JSONParserException ("Unknown attribute '" + name +
137
- "' (supported attributes: allDeclaredConstructors, allPublicConstructors, allDeclaredMethods, allPublicMethods, allDeclaredFields, allPublicFields, methods, fields) in defintion of class " +
138
- clazz .getTypeName ());
143
+ } catch (NoClassDefFoundError e ) {
144
+ showWarning ("Could not register " + clazz .getTypeName () + ": " + name + " for reflection. Reason: " + formatError (e ) + "." );
139
145
}
140
146
}
141
147
}
@@ -168,6 +174,8 @@ private void parseField(Map<String, Object> data, Class<?> clazz) {
168
174
registry .register (allowWrite , clazz .getDeclaredField (fieldName ));
169
175
} catch (NoSuchFieldException e ) {
170
176
throw new JSONParserException ("Field " + clazz .getTypeName () + "." + fieldName + " not found" );
177
+ } catch (NoClassDefFoundError e ) {
178
+ showWarning ("Could not register field " + clazz .getTypeName () + "." + fieldName + " for reflection. Reason: " + formatError (e ) + "." );
171
179
}
172
180
}
173
181
@@ -196,31 +204,31 @@ private void parseMethod(Map<String, Object> data, Class<?> clazz) {
196
204
throw new JSONParserException ("Missing attribute 'name' in definition of method for class '" + clazz .getTypeName () + "'" );
197
205
}
198
206
207
+ boolean isConstructor = CONSTRUCTOR_NAME .equals (methodName );
199
208
if (methodParameterTypes != null ) {
200
209
try {
201
- Executable method ;
202
- if (CONSTRUCTOR_NAME .equals (methodName )) {
203
- method = clazz .getDeclaredConstructor (methodParameterTypes );
204
- } else {
205
- method = clazz .getDeclaredMethod (methodName , methodParameterTypes );
206
- }
210
+ Executable method = isConstructor ? clazz .getDeclaredConstructor (methodParameterTypes ) : clazz .getDeclaredMethod (methodName , methodParameterTypes );
207
211
registry .register (method );
208
212
} catch (NoSuchMethodException e ) {
209
- String parameterTypeNames = Stream .of (methodParameterTypes ).map (Class ::getSimpleName ).collect (Collectors .joining (", " ));
210
- throw new JSONParserException ("Method " + clazz .getTypeName () + "." + methodName + "(" + parameterTypeNames + ") not found" );
213
+ throw new JSONParserException ("Method " + formatMethod (clazz , methodName , methodParameterTypes ) + " not found" );
214
+ } catch (NoClassDefFoundError e ) {
215
+ showWarning ("Could not register method " + formatMethod (clazz , methodName , methodParameterTypes ) + " for reflection. Reason: " + formatError (e ) + "." );
211
216
}
212
217
} else {
213
- boolean found = false ;
214
- boolean isConstructor = CONSTRUCTOR_NAME .equals (methodName );
215
- Executable [] methods = isConstructor ? clazz .getDeclaredConstructors () : clazz .getDeclaredMethods ();
216
- for (Executable method : methods ) {
217
- if (isConstructor || method .getName ().equals (methodName )) {
218
- registry .register (method );
219
- found = true ;
218
+ try {
219
+ boolean found = false ;
220
+ Executable [] methods = isConstructor ? clazz .getDeclaredConstructors () : clazz .getDeclaredMethods ();
221
+ for (Executable method : methods ) {
222
+ if (isConstructor || method .getName ().equals (methodName )) {
223
+ registry .register (method );
224
+ found = true ;
225
+ }
220
226
}
221
- }
222
- if (!found ) {
223
- throw new JSONParserException ("Method " + clazz .getTypeName () + "." + methodName + " not found" );
227
+ if (!found ) {
228
+ throw new JSONParserException ("Method " + clazz .getTypeName () + "." + methodName + " not found" );
229
+ }
230
+ } catch (NoClassDefFoundError e ) {
231
+ showWarning ("Could not register method " + clazz .getTypeName () + "." + methodName + " for reflection. Reason: " + formatError (e ) + "." );
224
232
}
225
233
}
226
234
}
@@ -242,4 +250,17 @@ private Class<?>[] parseTypes(List<Object> types) {
242
250
return result .toArray (new Class <?>[result .size ()]);
243
251
}
244
252
253
+ private static String formatError (Error e ) {
254
+ return e .getClass ().getTypeName () + ": " + e .getMessage ();
255
+ }
256
+
257
+ private static String formatMethod (Class <?> clazz , String methodName , Class <?>[] paramTypes ) {
258
+ String parameterTypeNames = Stream .of (paramTypes ).map (Class ::getSimpleName ).collect (Collectors .joining (", " ));
259
+ return clazz .getTypeName () + "." + methodName + "(" + parameterTypeNames + ")" ;
260
+ }
261
+
262
+ private static void showWarning (String message ) {
263
+ System .out .println ("WARNING: " + message );
264
+ }
265
+
245
266
}
0 commit comments