给定一个像com.abc.XYZException
这样的字符串我希望得到一个可抛出的类,可以从类路径中解析出该字符串作为类名。
private Class<? extends Throwable> getExceptionClass(String className){
return Class.forName(className);
}
此代码段无法编译,因为Class.forName(className)
返回Class<?>
但需要Class<? extends Throwable>
。如何退回Class<? extends Throwable>
?
答案 0 :(得分:2)
未经检查的演员表是不可避免的,但你可以通过在投票前检查输入是否符合来做更安全的事情。
您确实可以使用isAssignableFrom()
的{{1}}方法来检查加载的Class
实例是Class
类的子类。
Throwable
答案 1 :(得分:1)
正如评论中所建议的(未经检查的返回类的强制转换),这应该是您需要编译的内容:
private Class<? extends Throwable> getExceptionClass(String className) throws ClassNotFoundException {
return (Class<? extends Throwable>) Class.forName(className);
}
答案 2 :(得分:0)
这应该可以解决问题;
private Class<? extends Throwable> getExceptionClass(String className) throws ClassNotFoundException{
return (Class<? extends Throwable>) Class.forName(className);
}
答案 3 :(得分:0)
或者,如果没有类强制转换,您可以使用wildcard返回任何类类型:
public Class<? extends Throwable> getExceptionClass(String className) {
try {
Class<?> clazz = Class.forName(className);
if (!Throwable.class.isAssignableFrom(clazz)) {
throw new IllegalArgumentException("error in the provided classname");
}
return (Class<? extends Throwable>) clazz;
} catch (ClassNotFoundException e) {
// handling the exception
}
}