mirror of https://github.com/apache/cloudstack.git
utils: Reflection utilities to get cmd, annotation and fields
Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
This commit is contained in:
parent
d22229eb9d
commit
db297a338f
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue