217
218 private static AdapterInfo getAdapterInfo(final Class<?>[] types) {
219 final ClassAndLoader definingClassAndLoader = ClassAndLoader.getDefiningClassAndLoader(types);
220
221 final Map<List<Class<?>>, AdapterInfo> adapterInfoMap = ADAPTER_INFO_MAPS.get(definingClassAndLoader.getRepresentativeClass());
222 final List<Class<?>> typeList = types.length == 1 ? Collections.<Class<?>>singletonList(types[0]) : Arrays.asList(types.clone());
223 AdapterInfo adapterInfo;
224 synchronized(adapterInfoMap) {
225 adapterInfo = adapterInfoMap.get(typeList);
226 if(adapterInfo == null) {
227 adapterInfo = createAdapterInfo(types, definingClassAndLoader);
228 adapterInfoMap.put(typeList, adapterInfo);
229 }
230 }
231 return adapterInfo;
232 }
233
234 /**
235 * For a given class, create its adapter class and associated info.
236 *
237 * @param type the class for which the adapter is created
238 *
239 * @return the adapter info for the class.
240 */
241 private static AdapterInfo createAdapterInfo(final Class<?>[] types, final ClassAndLoader definingClassAndLoader) {
242 Class<?> superClass = null;
243 final List<Class<?>> interfaces = new ArrayList<>(types.length);
244 for(final Class<?> t: types) {
245 final int mod = t.getModifiers();
246 if(!t.isInterface()) {
247 if(superClass != null) {
248 return new AdapterInfo(AdaptationResult.Outcome.ERROR_MULTIPLE_SUPERCLASSES, t.getCanonicalName() + " and " + superClass.getCanonicalName());
249 }
250 if (Modifier.isFinal(mod)) {
251 return new AdapterInfo(AdaptationResult.Outcome.ERROR_FINAL_CLASS, t.getCanonicalName());
252 }
253 superClass = t;
254 } else {
255 if (interfaces.size() > 65535) {
256 throw new IllegalArgumentException("interface limit exceeded");
257 }
|
217
218 private static AdapterInfo getAdapterInfo(final Class<?>[] types) {
219 final ClassAndLoader definingClassAndLoader = ClassAndLoader.getDefiningClassAndLoader(types);
220
221 final Map<List<Class<?>>, AdapterInfo> adapterInfoMap = ADAPTER_INFO_MAPS.get(definingClassAndLoader.getRepresentativeClass());
222 final List<Class<?>> typeList = types.length == 1 ? Collections.<Class<?>>singletonList(types[0]) : Arrays.asList(types.clone());
223 AdapterInfo adapterInfo;
224 synchronized(adapterInfoMap) {
225 adapterInfo = adapterInfoMap.get(typeList);
226 if(adapterInfo == null) {
227 adapterInfo = createAdapterInfo(types, definingClassAndLoader);
228 adapterInfoMap.put(typeList, adapterInfo);
229 }
230 }
231 return adapterInfo;
232 }
233
234 /**
235 * For a given class, create its adapter class and associated info.
236 *
237 * @param types the class and interfaces for which the adapter is created
238 *
239 * @return the adapter info for the class.
240 */
241 private static AdapterInfo createAdapterInfo(final Class<?>[] types, final ClassAndLoader definingClassAndLoader) {
242 Class<?> superClass = null;
243 final List<Class<?>> interfaces = new ArrayList<>(types.length);
244 for(final Class<?> t: types) {
245 final int mod = t.getModifiers();
246 if(!t.isInterface()) {
247 if(superClass != null) {
248 return new AdapterInfo(AdaptationResult.Outcome.ERROR_MULTIPLE_SUPERCLASSES, t.getCanonicalName() + " and " + superClass.getCanonicalName());
249 }
250 if (Modifier.isFinal(mod)) {
251 return new AdapterInfo(AdaptationResult.Outcome.ERROR_FINAL_CLASS, t.getCanonicalName());
252 }
253 superClass = t;
254 } else {
255 if (interfaces.size() > 65535) {
256 throw new IllegalArgumentException("interface limit exceeded");
257 }
|