- /*
- 在使用反射过程中抛出的异常以及引发异常的原因:
- 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;
- }
- }
复制代码
|
|