zoukankan      html  css  js  c++  java
  • luogg_java学习_10_异常_反射

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.

    **转载请注明 出自 : luogg的博客园 ** 谢谢配合!

    异常_反射

    异常

    异常就是导致程序中断执行的一段指令流.
    在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 结合的几种方式:

    1. try,catch,finally
    2. try,catch
    3. 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中,提供了表示属性的类 Field
    Field 类常用方法:
    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);
    		}
    
  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/luogg/p/5932083.html
Copyright © 2011-2022 走看看