Java 从字符串className获取可丢弃的类对象
给定一个类似于Java 从字符串className获取可丢弃的类对象,java,Java,给定一个类似于com.abc.XYZException的字符串,我希望得到一个可以从类路径解析的可丢弃类,并将该字符串作为类名 private Class<? extends Throwable> getExceptionClass(String className){ return Class.forName(className); } private Class但是Class正如注释中所建议的(未选中返回类的强制转换),这应该是您需要的,以便编译它: private C
com.abc.XYZException
的字符串,我希望得到一个可以从类路径解析的可丢弃类,并将该字符串作为类名
private Class<? extends Throwable> getExceptionClass(String className){
return Class.forName(className);
}
private Class
但是Class正如注释中所建议的(未选中返回类的强制转换),这应该是您需要的,以便编译它:
private Class<? extends Throwable> getExceptionClass(String className) throws ClassNotFoundException {
return (Class<? extends Throwable>) Class.forName(className);
}
private Class这应该可以做到
private Class<? extends Throwable> getExceptionClass(String className) throws ClassNotFoundException{
return (Class<? extends Throwable>) Class.forName(className);
}
private Class未经检查的强制转换是不可避免的,但是在强制转换之前检查输入是否一致,可以更安全地执行操作。
您确实可以使用Class
的isAssignableFrom()
方法来检查加载的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
}
}
public Class clazz=Class.forName(className);
如果(!Throwable.class.isAssignableFrom(clazz)){
抛出新的IllegalArgumentException(“提供的类名中有错误”);
}
return(Class或不带Class cast)您可以使用以下命令使其返回任何类类型:
私有类getExceptionClass(字符串className)抛出ClassNotFoundException{
返回Class.forName(className);
}
Class.forName()
加载任何类,无论它是否扩展了Throwable
。因此,您无法真正使其在编译时安全(使用反射API时的标准问题)。您应该能够进行未经检查的强制转换,这将解决编译问题,但如果xyzeException
不是Throwable
,您将在运行时获得异常。强制转换:返回(类
private Class<?> getExceptionClass(String className) throws ClassNotFoundException{
return Class.forName(className);
}