I am trying to do Java Reflection using Class c = Class.forName(className)
I want to pass in the className without specifying the package n
import com.bvs.copy.UserEffitrac;
public class TestCopy {
public static void main(String[] args) {
/* Make object of your choice ans assign it to
Object class reference */
Object obj = new UserEffitrac();
/* Create a Class class object */
Class c = obj.getClass();
/* getSimpleName() gives UserEffitrac as output */
System.out.println(c.getName());
/*getName() or getConicalName() will give complete class name./
}
}
First, get all classes with the Reflections library
Reflections reflections = new Reflections();
Set<Class<?>> allClasses = reflections.getSubTypesOf(Object.class);
Next, build up a lookup-map.
// Doesn't handle collisions (you might want to use a multimap such as http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html instead)
Map<String, Class<?>> classBySimpleName = new HashMap<>();
for(Class<?> c : allClasses) {
classBySimpleName.put(c.getSimpleName(), c);
}
When you need to lookup a class you'll do:
Class<?> clazz = classBySimpleName.get(className);
From the javadoc of java.lang.Class its not possible
public static Class<?> forName(String className)
throws ClassNotFoundException
Parameters:
className - the fully qualified name of the desired class.
Returns:
the Class object for the class with the specified name.
One simple option would be to have a list of candidate packages:
for (String pkg : packages) {
String fullyQualified = pkg + "." + className;
try {
return Class.forName(fullyQualified);
} catch (ClassNotFoundException e) {
// Oops. Try again with the next package
}
}
This won't be the nicest code in the world, admittedly...
You may be able to make it faster by looking for alternative calls (e.g. ClassLoader.getResource) which don't throw exceptions if the class isn't found.
There's certainly nothing I'm aware of to allow you to find a class without specifying a name at all.