3

我正在尝试使用 Java 反射Class c = Class.forName(className)

我想在className不指定包名称的情况下传递,因为字符串className将包含来自多个子包的类,例如com.A.*com.B.*...。com.Z.*

可能吗?

如果在这种情况下我有很多子包,那么进行案例切换以预先挂起不同的子包是不可行的。

4

3 回答 3

9

一个简单的选择是列出候选包:

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找不到类时不会引发异常的替代调用(例如 )来加快速度。

我当然知道没有任何事情可以让您在指定名称的情况下找到一个类。

于 2012-08-13T07:21:25.970 回答
5

首先,使用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);
于 2012-08-13T07:44:50.430 回答
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.
于 2012-08-13T07:21:08.547 回答