首页 > 代码库 > 19 异常,反射(转)
19 异常,反射(转)
异常_反射
异常
异常就是导致程序中断执行的一段指令流.
在java中, 对于异常在API中也有明确的定义,叫做异常类.
- Error : JVM的错误, 程序中不进行处理, 交给虚拟机.
- Exception : 程序中出现的异常, 可以在程序中进行处理 . Exception 又分为编译时异常,运行时异常.
- 编译时异常 : 代码编写完成之后编译无法通过. 例如:ParseException(转换异常),ClassCastException类型转换异常
- 运行时异常 : 代码本身没有问题, 可以通过编译, 运行时候会出现错误.例如 : NullPointerException(空指针异常)、ArithmeticException(数学计算异常,0作被除数)、ArrayIndexOutOfBoundsException(数组角标越界异常)
异常处理
1.捕获异常 :try catch 直接处理可能出现的异常
2.声明异常 : throws 声明告诉调用中可能的异常, 暴露问题, 调用者自己处理
try{ //可能出现异常的代码 }catch(Exception1 e1){ //处理的方式1 e.printStaticTrace(); }[catch](Exception2 e2{ //处理的方式2}[finally]{ //一定要执行的代码 }
- finally : 异常的同意出口, 不管程序是否产生异常, finally语句块中的内容一定会被执行.
- throws关键字 : 用来声明方法, 表示此方法不处理异常, 而是抛给调用处, 谁调用这个方法, 谁就去处理这个异常.
- throw关键字 : 正常情况下,异常是由JVM抛出的,除了这种情况之外,我们还可以通过 throw 关键字人为的抛出一个异常。
try,catch,finally 结合的几种方式:
- try,catch,finally
- try,catch
- try,finally
反射
简介
反射机制主要是用来破解类文件的
正常的文件执行:在源代码已知的情况下,导入类路径,通过 new 关键字实例化该类对象,通过对象名使用这个类
反射的文件执行:在源代码未知的情况下,对类文件进行破解,然后再去使用这个类
要想破解类, 就必须要对类进行了解, 类其实也是一种类型, 对于一个类来讲, 应该有属性, 普通方法, 构造方法.
java提供了Class类, 用来对类本身进行操作, 通过Class类可以完整的得到一个类的结构,例如: 方法,属性等.
Class类中的常用方法介绍 :
获取属性相关: getDeclaredFields(): //获取类自己定义的全部属性 getFields()://获取类自己定义的和父类继承来的 public 属性 获取构造方法: getConstructors()://获取公共的构造方法 getDeclaredConstructors(): //获取所有构造方法 获取一般方法: getMethods()://获取自己类和父类的 public 方法 getDeclaredMethods()://获取自己类的所有方法getName(); 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。getModifiers(); 返回此类或接口以整数编码的 Java 语言修饰符。
获取class类的三种方法:
创建 Class 对象 Class 类没有构造方法,创建 Class 对象,有三种方法: 第一种:Class.forNama("完整包名.类名"); 例如:Class.forName("com.weixin.Student"); 第二种:通过对象名 .getClass(); 第三种:类名 .class //第一种方法 Class<?> clazz = null; try { clazz = Class.forName("com.weixin.Teacher"); } catch (ClassNotFoundException e) { e.printStackTrace(); } /*//第二种方法 Class clazz2 = Teacher.class; //第三种方法 Teacher teacher = new Teacher(); Class clazz3 = teacher.getClass();*/ //获取属性 Field[] f = clazz.getDeclaredFields(); for(Field f1 : f) { //获取属性的名字 System.out.println(f1.getName()); //获取属性的访问修饰符 System.out.println(Modifier.toString(f1.getModifiers())); //获取属性的数据类型 System.out.println(f1.getType().getName()); }
破解属性
在API中,提供了表示属性的类 FieldField 类常用方法:getName():获取属性名getType().getName():获取属性类型Modifier.toString((f1.getModifiers()));获取属性修饰符private还是public
破解方法:
Method[] m = clazz.getDeclaredMethods(); for(Method m1:m) { System.out.println(Modifier.toString(m1.getModifiers())+" "); System.out.println(m1.getName()+" "); }
方法的运行:
Class<?> clazz = null; try { clazz = Class.forName("com.weixin.Teacher"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Method[] m = clazz.getDeclaredMethods(); for(Method m1:m) { System.out.println(m1); }
19 异常,反射(转)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。