我正在一个非常大的应用程序中工作,其中包含大量用户定义的类。我需要找到.class文件的完全限定类名,以便我可以在运行时加载它。
.class文件的名称作为JSON Web Tokenized URL中的键值对传递。我解密到令牌并捕获相关参数。这些参数是用户重定向的ID和Web类。
Claims jwtVerified = bus.decryptJsonWebToken(token);
if(jwtVerified != null){
String Id = jwtVerified.get("ID").toString();
String page = jwtVerified.get("page").toString();
PageParameters pageParameters = new PageParameters();
pageParameters.add("Id", Id);
try {
Class<Page> c = null;
c = (Class<Page>) Class.forName("com.foo." + page);
throw new RestartResponseException(c, pageParameters);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
问题在于我不想硬编码“com.foo”。因为不同的页面可以作为页面变量传递。这些类存在于不同的包中(例如,“com.foo.Myclass.class”vs“com.bar.MyClass2.class”)。此外,如果我不提供完全限定的类路径,则抛出java.lang.ClassNotFoundException。
答案 0 :(得分:0)
您可以使用Reflections包,但您必须确保没有两个具有相同名称的类。
这段代码可能是一个好的开始:
Reflections reflections = new Reflections("com.yourpackage", new SubTypesScanner());
final Collection<Class<? extends Page>> allTypes = reflections.getSubTypesOf(Page.class);
final Map<String, Class<? extends Page>> shortNameToClass = new HashMap<>();
for (Class<? extends Page> type : allTypes) {
shortNameToClass.put(type.getSimpleName(), type);
}
for (Map.Entry<String, Class<? extends Page>> entry : shortNameToClass.entrySet()) {
System.out.println(entry.getKey() + "->" + entry.getValue());
}