没有限定名称的Java Reflection

hum*_*nsg 2 java reflection

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

我想在通过className不指定包名作为字符串className将包含类多个子包说com.A.*,com.B.*....com.Z.*

可能吗?

如果我在这种情况下有许多子包,那么做一个案例切换来预先挂起不同的子包是不可行的.

Jon*_*eet 8

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

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),如果找不到类,则不会抛出异常,从而使其更快.

当然没有什么我能够让你在没有指定名字的情况下找到一个类.


Ale*_*øld 5

首先,使用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)

  • 您不认为您不必要地实例化不需要的类吗? (3认同)