@Override public <T extends Annotation> T getAnnotation(final Class<T> annotationClass) { org.jboss.forge.parser.java.Annotation<?> annotation = null; // https://issues.jboss.org/browse/FORGE-439: support annotations on readMethod if (this.readMethod != null) { annotation = this.readMethod.getAnnotation(annotationClass.getName()); } if (annotation == null && this.privateField != null) { annotation = this.privateField.getAnnotation(annotationClass.getName()); } if (annotation != null) { T annotationProxy = AnnotationProxy.newInstance(annotation); return annotationProxy; } return null; }
/** * Parses the given literal value into the given returnType. Supports all standard annotation * types (JLS 9.7). */ private Object parse(String literalValue, Class<?> returnType) throws ClassNotFoundException { // Primitives if (byte.class.equals(returnType)) { return Byte.valueOf(literalValue); } if (short.class.equals(returnType)) { return Short.valueOf(literalValue); } if (int.class.equals(returnType)) { return Integer.valueOf(literalValue); } if (long.class.equals(returnType)) { String valueToUse = literalValue; if (valueToUse.endsWith("l") || valueToUse.endsWith("L")) { valueToUse = valueToUse.substring(0, valueToUse.length() - 1); } return Long.valueOf(valueToUse); } if (float.class.equals(returnType)) { String valueToUse = literalValue; if (valueToUse.endsWith("f") || valueToUse.endsWith("F")) { valueToUse = valueToUse.substring(0, valueToUse.length() - 1); } return Float.valueOf(valueToUse); } if (double.class.equals(returnType)) { String valueToUse = literalValue; if (valueToUse.endsWith("d") || valueToUse.endsWith("D")) { valueToUse = literalValue.substring(0, valueToUse.length() - 1); } return Double.valueOf(valueToUse); } if (boolean.class.equals(returnType)) { return Boolean.valueOf(literalValue); } if (char.class.equals(returnType)) { return Character.valueOf(literalValue.charAt(1)); } // Arrays if (returnType.isArray()) { String[] values = literalValue.substring(1, literalValue.length() - 1).split(","); int length = values.length; Class<?> componentType = returnType.getComponentType(); Object array = Array.newInstance(componentType, length); for (int loop = 0; loop < length; loop++) { Array.set(array, loop, parse(values[loop], componentType)); } return array; } // Enums if (returnType.isEnum()) { Enum<?>[] constants = (Enum<?>[]) returnType.getEnumConstants(); String valueToUse = StringUtils.substringAfterLast(literalValue, '.'); for (Enum<?> inst : constants) { if (inst.name().equals(valueToUse)) { return inst; } } return null; } // Strings if (String.class.equals(returnType)) { return literalValue.substring(1, literalValue.length() - 1); } // Classes if (Class.class.equals(returnType)) { String resolvedType = StringUtils.substringBefore(literalValue, ".class"); resolvedType = ((JavaSource<?>) this.annotationSource.getOrigin()).resolveType(resolvedType); return Class.forName(resolvedType); } // Annotations if (Annotation.class.isAssignableFrom(returnType)) { String resolvedType = StringUtils.substringAfter(literalValue, "@"); resolvedType = ((JavaSource<?>) this.annotationSource.getOrigin()).resolveType(resolvedType); return AnnotationProxy.newInstance(this.annotationSource); } // Unknown throw new UnsupportedOperationException(returnType.getSimpleName()); }