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 结合的几种方式:

  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);
        }
时间: 2024-11-08 23:07:47

19 异常,反射(转)的相关文章

【C#进阶系列】19 异常和状态管理

异常就是指成员没有完成它的名称所宣示的行动. public class Girl { public string Name { get; set; } } public class Troy{ Girl girl; public void Love() { Console.WriteLine("Troy爱上了" + girl.Name); } } 上面这段代码会有异常,因为Troy去执行Love这个函数,然而其中girl根本就没有赋值.本来Troy预期完成爱一个姑娘这个行动,结果发生了

python入门19 异常及异常处理 异常捕获

常见异常举例 """ 一些异常举例:""" '''模块不存在 ModuleNotFoundError: No module named 'data' ''' #import data1 '''索引越界 IndexError: list index out of range ''' li = [1,2] #li[3] '''key不存在 KeyError: 'a' ''' dict1 = {} #dict1['a'] ''' NameError:

黑马程序员——java高新技术(新特性、反射、泛型)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java高新技术 第一部分——JDK1.5新特性 1.增强for循环 格式: for(元素类型 变量名 : Collection集合 & 数组 ) { }//增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 高级for循环和传统for循环的区别: 高级for循环在使用时,必须要明确被遍历的目标.这个目标,可以是Collection集合或者数组,如果遍历Collec

IOS开发反射和动态调用总结

和java一样,Object-C也提供了反射的机制. 每一个类都有一个Class,获取Class有以下三种方法. // insert code here... //通过字符串获取class Class clazz = NSClassFromString(@"NSString"); NSLog(@"clazz的类型是%@",clazz); //直接用calzz 来创建对象 id str = [[clazz alloc] init]; //通过对象来获取class NS

C#反射与特性(一):反射基础

目录 C#反射与特性(一):反射基础 1. 说明 1.1 关于反射.特性 2. 程序集操作 2.1 获取 程序集对象(Assembly) 2.2 Assembly 使用 2.3 获取程序集的方式 C#反射与特性(一):反射基础 1. 说明 1.1 关于反射.特性 在 <C# 7.0 本质论>中,关于这方面的知识在 <第十八章 反射.特性和动态编程>:在<C# 7.0 核心技术指南>中,这部分内容在<第19章 反射和元数据>. [图片来自 <C# 7.0

Python中类的特殊属性和魔术方法

1.属性 属性 含义 __name__ 类.函数.方法等的名字   __dir__ __module__ 类定义所在的模块名 __class__ 对象或类所属的类   只是返回基类 __bases__ 返回自己到object的类,类的基类元组,顺序为在基类列表中出现的顺序. __doc__ 类,函数的文档字符串,如果没有定义则为None. __mro__ 类的不是实例的.类的mro,class.mro()返回的结果保存在__mro__中. __dict__ 类或实例属性,可写的字典. 标识符和名

C#基础知识之十一

由朱朱编写,转载请注明出自朱朱家园http://blog.csdn.net/zhgl7688 1.  同步编程是只有一个线程从程序的第一行语句到最后一行语句顺序执行.异步编程是指程序发起多个线程,它们在理论上是同一时间执行的. 2.  .net4.0引入一个新的类库,叫做任务并行库,极大简化并行编程.例:Parallel.For和Parallel.ForEach. 3.  预处理指令指编译器如何处理源代码. 4.  预处理必须和C#代码在不同的行,不需要以分号结尾,包含预处理指令的第一行必须以#

Linq之Lambda进阶

目录 写在前面 系列文章 带有标准查询运算符的Lambda Lambda中类型推断 Lambda表达式中变量作用域 异步Lambda 总结 写在前面 上篇文章介绍了Lambda的基本概念以及匿名方法,本篇继续介绍Lambda的一些内容,既然学了,就要总结的全面一点. 系列文章 Linq之Lambda表达式初步认识 带有标准查询运算符的Lambda 什么事标准查询运算符? “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法. 大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实

核心技术 读书笔记

Java 核心技术 l  字符串是用标准的Unicode 格式存储的 l  main 方法必须声明为public,且必须是静态的 l  用花括号划分程序的各个部分称为块 l  Byte  范围是-128到127 (包括0 一共256) l  0x 16进制的前缀:0 是8进制的前缀:0b 是二进制的前缀 l   double表示的精度是float的二倍,后缀加D:后缀加F l  Static final 设置一个类常量 l  const是java保留关键字,goto 是保留字 l  位运算符>>