黑马程序员技术交流社区
标题:
反射程序中的常见异常以及产生原因总结
[打印本页]
作者:
周博文
时间:
2015-8-25 14:48
标题:
反射程序中的常见异常以及产生原因总结
/*
在使用反射过程中抛出的异常以及引发异常的原因:
1.ClassNotFoundException
抛出该异常的方法:Class forName(String className)
原因:没有找到参数className所对应的类,即类名错误
2.NoSuchMethodException
抛出该异常的方法:Constructor getConstructor()...
Method getMethod(String name, Class<?>...paramTypes)...
原因:没有找到对应的方法,即方法名或参数有误
3.InstantiationException
抛出该异常的方法:Constructor newInstance()
原因:该类无法被实例化,即无法创建对象,如抽象类,接口,基本数据类型
或者在类中没有提供空参构造方法。
注意:要使用反射创建类的实例,则类应该提供空参构造。
4.IllegalAccessException
抛出该异常的方法:通过反射创建实例,set/get成员变量,调用方法
原因:没有访问成员的对应权限
注意:可以通过setAccessible(true)进行暴力访问
5.InvocationTargetException
抛出该异常的方法:Method.invoke(..)
Constructor.newInstance(..)
原因:通过反射的方式调用的方法或构造方法如果抛出其他异常,
则会被包装成该异常。顾名思义:调用目标所产生的异常。
*/
import java.lang.reflect.*;
public class ReflectExceptionDemo {
public static void main(String[] args) throws Exception{
// 1.ClassNotFoundException
try{
Class c = Class.forName("hello");
}
catch (ClassNotFoundException e){
System.out.println("ClassNotFoundException 被捕获");
}
// 2.NoSuchMethodException
try{
Class c = java.util.HashSet.class;
Method m = c.getMethod("setName");
}
catch (NoSuchMethodException e){
System.out.println("NoSuchMethoException 被捕获");
}
// 3.InstantiationException
try{
Class c = java.util.AbstractSet.class;
Constructor con = c.getDeclaredConstructor();
con.setAccessible(true);
Object obj = con.newInstance();
}
catch (InstantiationException e){
System.out.println("InstantiationException 被捕获");
}
// 4.IllegalAccessException
try{
Class c = Person.class;
Field f = c.getDeclaredField("name");
Object instance = c.getConstructor().newInstance();
f.set(instance, "小白");
}
catch (IllegalAccessException e){
System.out.println("IllegalAccessException 被捕获");
}
// 5.InvocationTargetException
try{
Class c = Person.class;
Object obj = c.getConstructor().newInstance();
Method m = c.getMethod("method");
m.invoke(obj);
}
catch (InvocationTargetException e){
System.out.println("InvocationTargetException 被捕获");
}
}
}
class Person{
private String name = "小明";
public Person(){}
// 该方法抛出一个运行时异常
public int method(){
return 10/0;
}
}
复制代码
作者:
风华正茂
时间:
2015-8-25 16:30
谢谢楼主分享
作者:
sven556677
时间:
2015-8-25 16:47
学习了,用反射每次后面都要catch一大堆。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2