繁体   English   中英

从String className获取可抛出的类对象

[英]Get throwable class object from String className

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

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

这个片段无法编译,因为Class.forName(className)返回Class<?>但是Class<? extends Throwable> Class<? extends Throwable>是必需的。 如何返回Class<? extends Throwable> Class<? extends Throwable>

未经检查的演员阵容是不可避免的,但你可以通过在投票之前检查输入是否符合来做更安全的事情。
事实上,你可以使用isAssignableFrom()的方法Class来检查Class加载实例是一个子类Throwable类。

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

正如评论中所建议的(未经检查的返回类的强制转换),这应该是你需要的,以便让它被编译:

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

这应该可以解决问题;

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

或者没有类强制转换,您可以使用通配符返回任何类类型:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM