我正在使用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
答案 0 :(得分:0)
请阅读Java中的类加载器层次结构及其遵循的合同。 This article is one of many describing the loaders hierarchy
在您的代码中,您需要系统类加载器来加载您的课程。这意味着只会为您的班级查询 Bootstrap 和系统类加载器。
要增加搜索区域,只需调用
即可this.getClass().getClassLoader().loadClass(className);
...应该归还你的班级。