玩:ClassLoader找不到我的班级

时间:2016-02-19 14:12:11

标签: java playframework playframework-2.0 java-8

我正在使用Play for Java,我在我的Application.java中尝试了这个。

    // The name of the class to search
    String className = "my.fake.company.SuperGreatClass";
    Reflections reflections = new Reflections("", new SubTypesScanner(false));

    // All classes
    Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);

    for (Class c : allClasses){
        String cName = c.getName();
        // Find the class that matches the name to the one we are looking for
        if (cName.contains(className))
            play.Logger.info(cName); // It always succeeds and logs the name correctly
    }

    ClassLoader classLoader = ClassLoader.getSystemClassLoader();

    try {
        Class clazz = classLoader.loadClass(className);
        Constructor constructor = clazz.getConstructor();
    } catch (Exception e) {
        play.Logger.error("NOT FOUND: " + e.getMessage());
        return badRequest("Cannot find that super great class of yours!");
    }

反射部分正确识别我的类,但ClassLoader没有。不幸的是,我使用的是使用第二种方法的第三方库,我无法改变它。

我可以做些什么来改变ClassLoader的行为吗?我找到了answer,但我不确定这是否有用。

日志输出为:

2016-02-19 16:00:17 +0200 [INFO ] from application in application-akka.actor.default-dispatcher-3 -  - my.fake.company.SuperGreatClass
2016-02-19 16:00:18 +0200 [ERROR] from application in application-akka.actor.default-dispatcher-3 -  - NOT FOUND: my.fake.company.SuperGreatClass

1 个答案:

答案 0 :(得分:0)

请阅读Java中的类加载器层次结构及其遵循的合同。 This article is one of many describing the loaders hierarchy

在您的代码中,您需要系统类加载器来加载您的课程。这意味着只会为您的班级查询 Bootstrap 系统类加载器。

要增加搜索区域,只需调用

即可
this.getClass().getClassLoader().loadClass(className); 

...应该归还你的班级。