return AnnotationProxy.getProxy(components, annotationClass, dynamicClassLoader, XMLConversionManager.getDefaultManager());
}
// Now overwrite the default values with anything we find in the XJC annotation instance.
for (Object key : memberValues.keySet()) {
JAnnotationValue xjcValue = (JAnnotationValue) memberValues.get(key);
if (xjcValue instanceof JAnnotationArrayMember) {
List<Object> values = (List<Object>) PrivilegedAccessHelper.getValueFromField(JANNOTATIONARRAYMEMBER_VALUES, xjcValue);
Object[] valuesArray = new Object[values.size()];
for (int i = 0; i < values.size(); i++) {
if (values.get(i) instanceof JAnnotationUse) {
JAnnotationUse xjcAnno = (JAnnotationUse) values.get(i);
XJCJavaAnnotationImpl anno = new XJCJavaAnnotationImpl(xjcAnno, dynamicClassLoader);
valuesArray[i] = anno.getJavaAnnotation();
} else {
Field valueField = PrivilegedAccessHelper.getDeclaredField(values.get(i).getClass(), "value", true);
Object value = PrivilegedAccessHelper.getValueFromField(valueField, values.get(i));
if (value instanceof JStringLiteral) {
JStringLiteral strvalue = (JStringLiteral) value;
valuesArray[i] = strvalue.str;
} else {
// XmlSeeAlso.value = Array of JDefinedClasses
Field valClField = PrivilegedAccessHelper.getDeclaredField(value.getClass(), "val$cl", true);
JDefinedClass wrappedValue = (JDefinedClass) PrivilegedAccessHelper.getValueFromField(valClField, value);
Class<?> tempDynClass = dynamicClassLoader.createDynamicClass(wrappedValue.fullName());
valuesArray[i] = tempDynClass;
}
}
}
components.put(key.toString(), valuesArray);
} else if (xjcValue.getClass().getName().contains("JAnnotationStringValue")) {
// JAnnotationStringValue is a package-protected class so need to compare class name.
// Cannot cache this field because JAnnotationStringValue is a protected class.
Field valueField = PrivilegedAccessHelper.getDeclaredField(xjcValue.getClass(), "value", true);
Object objValue = PrivilegedAccessHelper.getValueFromField(valueField, xjcValue);
if (objValue instanceof JStringLiteral) {
JStringLiteral value = (JStringLiteral) objValue;
String stringValue = value == null ? null : value.str;
components.put(key.toString(), stringValue);
} else if (objValue.getClass().getName().contains("JAtom")) {
// e.g. XmlElement.required = JAtom
// Cannot cache this field because JAtom is a protected class.
Field whatField = PrivilegedAccessHelper.getDeclaredField(objValue.getClass(), "what", true);
String value = (String) PrivilegedAccessHelper.getValueFromField(whatField, objValue);
components.put(key.toString(), value);
} else if (objValue.getClass().getName().contains("JExpr$1")) {
// XmlJavaTypeAdapter contains a JDefinedClass
Field valClField = PrivilegedAccessHelper.getDeclaredField(objValue.getClass(), "val$cl", true);
JClass wrappedValue = (JClass) PrivilegedAccessHelper.getValueFromField(valClField, objValue);
Object tempDynClass = null;
if (!(wrappedValue.getTypeParameters().isEmpty())) {
// Parameterized type, so get the actual parameter type and create that.
wrappedValue = wrappedValue.getTypeParameters().get(0);
}
try {
// Attempt to look up the class normally
tempDynClass = Class.forName(wrappedValue.fullName());
} catch (Exception e) {
if (annotationClass.equals(XmlEnum.class)) {
tempDynClass = String.class;
} else {
tempDynClass = dynamicClassLoader.createDynamicClass(wrappedValue.fullName());
}
}
components.put(key.toString(), tempDynClass);
}
} else {
// e.g. XmlSchema.elementFormDefault = JAnnotationUse$1
// Cannot cache this field because JAtom is a protected class.
Field valValueField = PrivilegedAccessHelper.getDeclaredField(xjcValue.getClass(), "val$value", true);
Object value = PrivilegedAccessHelper.getValueFromField(valValueField, xjcValue);
components.put(key.toString(), value);
}
}