utils: Reflection utilities to get cmd, annotation and fields

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
This commit is contained in:
Rohit Yadav 2013-01-08 18:36:31 -08:00
parent d22229eb9d
commit db297a338f
2 changed files with 68 additions and 0 deletions

View File

@ -146,6 +146,11 @@
<version>${cs.commons-io.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>${cs.reflections.version}</version>
</dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>

View File

@ -16,10 +16,14 @@
// under the License.
package com.cloud.utils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import com.cloud.utils.exception.CloudRuntimeException;
import org.reflections.Reflections;
public class ReflectUtil {
public static Pair<Class<?>, Field> getAnyField(Class<?> clazz, String fieldName) {
@ -50,4 +54,63 @@ public class ReflectUtil {
return null;
}
// Gets all classes with some annotation from a package
public static Set<Class<?>> getClassesWithAnnotation(Class<? extends Annotation> annotation,
String[] packageNames) {
Reflections reflections;
Set<Class<?>> classes = new HashSet<Class<?>>();
for(String packageName: packageNames) {
reflections = new Reflections(packageName);
classes.addAll(reflections.getTypesAnnotatedWith(annotation));
}
return classes;
}
// Checks against posted search classes if cmd is async
public static boolean isCmdClassAsync(Class<?> cmdClass,
Class<?>[] searchClasses) {
boolean isAsync = false;
Class<?> superClass = cmdClass;
while (superClass != null && superClass != Object.class) {
String superName = superClass.getName();
for (Class<?> baseClass: searchClasses) {
if (superName.equals(baseClass.getName())) {
isAsync = true;
break;
}
}
if (isAsync)
break;
superClass = superClass.getSuperclass();
}
return isAsync;
}
// Returns all fields across the base class for a cmd
public static Field[] getAllFieldsForClass(Class<?> cmdClass,
Class<?>[] searchClasses) {
Field[] fields = cmdClass.getDeclaredFields();
Class<?> superClass = cmdClass.getSuperclass();
while (superClass != null && superClass != Object.class) {
String superName = superClass.getName();
for (Class<?> baseClass: searchClasses) {
if(!baseClass.isAssignableFrom(superClass))
continue;
if (!superName.equals(baseClass.getName())) {
Field[] superClassFields = superClass.getDeclaredFields();
if (superClassFields != null) {
Field[] tmpFields = new Field[fields.length + superClassFields.length];
System.arraycopy(fields, 0, tmpFields, 0, fields.length);
System.arraycopy(superClassFields, 0, tmpFields, fields.length, superClassFields.length);
fields = tmpFields;
}
}
}
superClass = superClass.getSuperclass();
}
return fields;
}
}