我正在尝试使用Java Reflection Class c = Class.forName(className)
我想在通过className不指定包名作为字符串className将包含类多个子包说com.A.*,com.B.*....com.Z.*
可能吗?
如果我在这种情况下有许多子包,那么做一个案例切换来预先挂起不同的子包是不可行的.
一个简单的选择是列出候选包:
for (String pkg : packages) {
String fullyQualified = pkg + "." + className;
try {
return Class.forName(fullyQualified);
} catch (ClassNotFoundException e) {
// Oops. Try again with the next package
}
}
Run Code Online (Sandbox Code Playgroud)
这不是世界上最好的代码,诚然......
您可以通过查找替代调用(例如ClassLoader.getResource),如果找不到类,则不会抛出异常,从而使其更快.
当然没有什么我能够让你在没有指定名字的情况下找到一个类.
首先,使用Reflections库获取所有类
Reflections reflections = new Reflections();
Set<Class<?>> allClasses = reflections.getSubTypesOf(Object.class);
Run Code Online (Sandbox Code Playgroud)
接下来,建立一个查找地图。
// 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);
}
Run Code Online (Sandbox Code Playgroud)
当您需要查找类时,您将执行以下操作:
Class<?> clazz = classBySimpleName.get(className);
Run Code Online (Sandbox Code Playgroud)