没有限定名称的Java Reflection

时间:2012-08-13 07:17:37

标签: java reflection

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

进行Java反射

我想传递className而不指定包名称,因为字符串className将包含多个子包中的类com.A.*com.B.* ... 。com.Z.*

有可能吗?

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

4 个答案:

答案 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./  
    }
}