A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*
  2. 在使用反射过程中抛出的异常以及引发异常的原因:
  3. 1.ClassNotFoundException
  4.         抛出该异常的方法:Class forName(String className)
  5.         原因:没有找到参数className所对应的类,即类名错误

  6. 2.NoSuchMethodException
  7.         抛出该异常的方法:Constructor getConstructor()...
  8.                                           Method getMethod(String name, Class<?>...paramTypes)...
  9.         原因:没有找到对应的方法,即方法名或参数有误

  10. 3.InstantiationException
  11.         抛出该异常的方法:Constructor newInstance()
  12.         原因:该类无法被实例化,即无法创建对象,如抽象类,接口,基本数据类型
  13.         或者在类中没有提供空参构造方法。
  14.         注意:要使用反射创建类的实例,则类应该提供空参构造。

  15. 4.IllegalAccessException
  16.         抛出该异常的方法:通过反射创建实例,set/get成员变量,调用方法
  17.         原因:没有访问成员的对应权限
  18.         注意:可以通过setAccessible(true)进行暴力访问

  19. 5.InvocationTargetException
  20.         抛出该异常的方法:Method.invoke(..)  
  21.                                           Constructor.newInstance(..)
  22.         原因:通过反射的方式调用的方法或构造方法如果抛出其他异常,
  23.         则会被包装成该异常。顾名思义:调用目标所产生的异常。
  24. */
  25. import java.lang.reflect.*;

  26. public class ReflectExceptionDemo {
  27.         public static void main(String[] args) throws Exception{
  28.                 // 1.ClassNotFoundException
  29.                 try{
  30.                         Class c = Class.forName("hello");
  31.                 }
  32.                 catch (ClassNotFoundException e){
  33.                         System.out.println("ClassNotFoundException 被捕获");
  34.                 }

  35.                 // 2.NoSuchMethodException
  36.                 try{
  37.                         Class c = java.util.HashSet.class;
  38.                         Method m = c.getMethod("setName");
  39.                 }
  40.                 catch (NoSuchMethodException e){
  41.                         System.out.println("NoSuchMethoException 被捕获");
  42.                 }

  43.                 // 3.InstantiationException
  44.                 try{
  45.                         Class c = java.util.AbstractSet.class;
  46.                         Constructor con = c.getDeclaredConstructor();
  47.                         con.setAccessible(true);
  48.                         Object obj = con.newInstance();
  49.                 }
  50.                 catch (InstantiationException e){
  51.                         System.out.println("InstantiationException 被捕获");
  52.                 }

  53.                 // 4.IllegalAccessException
  54.                 try{
  55.                         Class c = Person.class;
  56.                         Field f = c.getDeclaredField("name");
  57.                         Object instance = c.getConstructor().newInstance();
  58.                         f.set(instance, "小白");
  59.                 }
  60.                 catch (IllegalAccessException e){
  61.                         System.out.println("IllegalAccessException 被捕获");
  62.                 }

  63.                 // 5.InvocationTargetException
  64.                 try{
  65.                         Class c = Person.class;
  66.                         Object obj = c.getConstructor().newInstance();
  67.                         Method m = c.getMethod("method");
  68.                         m.invoke(obj);
  69.                 }
  70.                 catch (InvocationTargetException e){
  71.                         System.out.println("InvocationTargetException 被捕获");
  72.                 }
  73.         }
  74. }

  75. class Person{
  76.         private String name = "小明";

  77.         public Person(){}

  78.         // 该方法抛出一个运行时异常
  79.         public int method(){
  80.                 return 10/0;
  81.         }
  82. }
复制代码


2 个回复

倒序浏览
谢谢楼主分享
回复 使用道具 举报
学习了,用反射每次后面都要catch一大堆。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马