从String className

时间:2017-08-08 14:17:24

标签: java

给定一个像com.abc.XYZException这样的字符串我希望得到一个可抛出的类,可以从类路径中解析出该字符串作为类名。

private Class<? extends Throwable> getExceptionClass(String className){
    return Class.forName(className);
}

此代码段无法编译,因为Class.forName(className)返回Class<?>但需要Class<? extends Throwable>。如何退回Class<? extends Throwable>

4 个答案:

答案 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
    }
  }