我正在尝试使用Class c = Class.forName(className)
我想传递className
而不指定包名称,因为字符串className
将包含多个子包中的类com.A.*
,com.B.*
... 。com.Z.*
有可能吗?
如果我在这种情况下有很多子包,那么做一个案例切换来预先挂起不同的子包是不可行的。
答案 0 :(得分:8)
一个简单的选择是列出候选包:
for (String pkg : packages) {
String fullyQualified = pkg + "." + className;
try {
return Class.forName(fullyQualified);
} catch (ClassNotFoundException e) {
// Oops. Try again with the next package
}
}
这不是世界上最好的代码,诚然......
我当然没有什么可以让你找到一个没有指定名称的类。
答案 1 :(得分:4)
首先,使用Reflections库获取所有类
Reflections reflections = new Reflections();
Set<Class<?>> allClasses = reflections.getSubTypesOf(Object.class);
接下来,构建一个查找映射。
// 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);
}
当你需要查找课程时,你会做:
Class<?> clazz = classBySimpleName.get(className);
答案 2 :(得分:0)
从java.lang.Class的javadoc中不可能
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.
答案 3 :(得分:-1)
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./
}
}