查找动态提供的.class名称

时间:2015-12-30 16:41:13

标签: java classpath classnotfoundexception

我正在一个非常大的应用程序中工作,其中包含大量用户定义的类。我需要找到.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。

1 个答案:

答案 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());
}