我正在尝试使用 Java 反射Class c = Class.forName(className)
我想在className
不指定包名称的情况下传递,因为字符串className
将包含来自多个子包的类,例如com.A.*
,com.B.*
...。com.Z.*
可能吗?
如果在这种情况下我有很多子包,那么进行案例切换以预先挂起不同的子包是不可行的。
我正在尝试使用 Java 反射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
}
}
诚然,这不会是世界上最好的代码......
您可以通过寻找在ClassLoader.getResource
找不到类时不会引发异常的替代调用(例如 )来加快速度。
我当然知道没有任何事情可以让您在不指定名称的情况下找到一个类。
首先,使用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);
从 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.