论坛类网站建设,遵义网站制作外包,想要黑掉一个网站 要怎么做,wordpress 页面nofollow本章概要
异常的分类及处理 异常的概念异常的分类处理异常的方式 反射机制 动态语言的概念反射机制的概念反射的作用Java 的反射 API反射的过程创建对象的两种方式Method 的 invoke 方法
1.2 异常的分类及处理
1.2.1 异常的概念
异常指在方法不能按正常方式完成时#xf…本章概要
异常的分类及处理 异常的概念异常的分类处理异常的方式 反射机制 动态语言的概念反射机制的概念反射的作用Java 的反射 API反射的过程创建对象的两种方式Method 的 invoke 方法
1.2 异常的分类及处理
1.2.1 异常的概念
异常指在方法不能按正常方式完成时可以通过抛出异常的方式退出该方法。在异常中封装了方法执行过程中的错误信息及原因调用方在获取该异常后可根据业务的情况选择处理该异常或继续抛出该异常。 在方法执行中出现异常时Java 异常处理机制会将代码的执行权交给异常处理器异常处理器根据在系统中定义的异常处理规则执行不同的异常处理逻辑抛出异常或捕捉并处理异常。
1.2.2 异常的分类
在 Java 中Throwable 是所有错误或异常的父类Throwable 又可分为 Error 和 Exception常见的 Error 有 AWTError、ThreadDeathException 又可分为 RuntimeException运行时异常和 CheckedException检查异常如下
Error 指 Java 程序运行错误。如果程序在启动时出现 Error则启动失败如果程序在运行过程中出现 Error则系统将退出进程。出现 Error 通常是因为系统的内部错误或资源耗尽Error 不能在运行过程中被动态处理。如果程序出现 Error则系统能做的工作也只能是记录错误的成因和安全终止。 Exception 指 Java 程序运行异常即运行中的程序发生了人们不期望发生的事件可以被 Java 异常处理机制处理。Exception 也是程序开发中异常处理的核心如图
RuntimeException指在 Java 虚拟机正常运行期间抛出的异常。RuntimeException 可被捕获并处理如果出现 RuntimeException那么一定是程序发生错误导致的。我们通常需要抛出该异常或捕获并处理该异常。常见的 RuntimeException 有 NullPointerException、ClassCastException、ArrayIndexOutOfBundsException 等。CheckedExceptionJava 编译器在编译阶段会检查 CheckedException 异常并强制程序捕获和处理此类异常即要求程序在可能出现异常的地方通过 try catch 语句块捕获并处理异常。常见的 CheckedException 有由于 I/O 错误导致的 IOExceptioin、SQLException、ClassNotFoundException 等。该异常一般由于打开错误的文件、SQL 语法错误、类不存在等引起。
1.2.3 处理异常的方式
处理异常有抛出异常和使用 try catch 语句块捕获并处理异常这两种方式。 1抛出异常指遇到异常时不进行具体处理而是将异常抛给调用者由调用者根据情况处理。有可能是直接捕获并处理也有可能是继续向上层抛出异常。抛出异常有三种方式throws、throw、系统自动抛出异常。其中throws 作用在方法上用于定义方法可能抛出的异常throw 作用在方法内表示明确抛出一个异常。 throw 和 throws 的具体区别如下
位置不同throws 作用在方法上和面跟着的是异常的类而 throw 作用在方法内后面跟着的是异常的对象。功能不同throws 用于声明方法在运行过程中可能出现的异常以便调用者根据不同的异常类型预先定义不同的处理方式throw 用于抛出封装了异常信息的对象程序在执行到 throw 时后续的代码将不再执行而是跳转到调用者并将异常信息抛给调用者。也就是说throw 后面的语句将无法被执行finally 语句块除外。
2使用 try catch 语句块捕获并处理异常使用 try catch 语句块捕获异常能够有针对地处理每种可能出现的异常并在捕捉到异常后根据不同的情况做不同的处理。 相关面试题
Java 中的异常处理方式机制有哪些★★★☆☆Error 和 Exception 的区别是什么★★☆☆☆throw 和 throws 的具体区别是什么★☆☆☆☆
1.3 反射机制
Java 的反射机制可以动态获取类和对象的信息以及动态调用对象的方法被广泛应用于动态代理的场景中。
1.3.1 动态语言的概念
动态语言指程序在运行时可以改变其结构的语言比如新的属性或方法的添加、删除等结构上的变化。JavaScript 、Ruby 、 Python 等都属于动态语言C、C 不属于动态语言。从反射的角度来说Java 属于半动态语言。
1.3.2 反射机制的概念
反射机制指在程序运行过程中对任意一个类都能获取其所有属性和方法并且对任意对象都能调用其任意方法。这种动态获取类和对象的信息以及动态调用对象的方法的功能被称为 Java 的反射机制。
1.3.3 反射的作用
Java 中的对象有两种类型编译时类型和运行时类型。编译时类型指在声明对象时采用的类型运行时类型指为对象赋值时所采用的的类型。 在如下代码中persion 对象的编译时类型为 Persion 运行时类型为 Student 因此无法在编译时获取在 Student 类中定义的方法
Persion persion new Student();因此程序在编译期间无法预知该对象和类的真实信息只能通过运行时信息来发现该对象和类的真实信息而其真实信息对象的属性和方法通常通过反射机制来获取这便是 Java 中反射机制的核心功能。
1.3.4 Java 的反射 API
Java 的反射 API 主要用于在运行过程中动态生成类、接口或对象等信息其常用 API 如下
Class 类用于获取类的属性、方法等信息Field 类表示类的成员变量用于获取和设置类中的属性值Method 类表示类的方法用于获取方法的描述信息或执行某个方法Constructor 类表示类的构造方法
1.3.5 反射的过程
反射的步骤如下
获取想要操作的类的 Class 对象该 Class 对象时反射的核心通过它可以调用类的任意方法。调用 Class 对象所对应的类中定义的方法这是反射的使用阶段使用反射 API 类来获取并调用类的属性和方法等信息。
获取 Class 对象的 3 种方式如下
调用某个对象的 getClass 方法以获取该类对应的 Class 对象
Persion p new Persion();
Class clazz p.getClass();调用某个类的 class 属性以获取该类对应的 Class 对象
Class clazz Persion.class;调用 Class 类中的 forName 静态方法以获取该类对应的 Class 对象这是最安全、性能也最好的方式
Class clazz Class.forName(fullClassPath); // fullClassPath 为类的包路径及名称我们在获得想要操作类的 Class 对象后可以通过 Class 类中的方法获取并查看该类中的方法和属性具体的实例代码如下
// 1.获取 Persion 类的 Class 对象
Class clazz Class.forName(hello.java.reflect.Persion);
// 2.获取Persion 类的所有方法的信息
Method[] method clazz.getDeclaredMethods();
for(Method m : method){System.out.println(m.toString);
}
// 3.获取 Persion 类的所有成员的属性信息
Field[] field clazz.getDeclaredFields();
for(Field f : field){System.out.println(f.toString);
}
// 4.获取 Persion 类的所有构造方法的信息
Constructor[] constructor clazz.getDeclaredConstructors();
for (Constructor c : constructor){System.out.println(c.toString);
}1.3.6 创建对象的两种方式
创建对象的两种方式如下
使用 Class 对象的 newInstance 方法创建该 Class 对象对应类的实例这种方式要求该 Class 对象对应的类有默认的空构造器。先使用 Class 对象获取指定的 Constructor 对象再调用 Constructor 对象的 newInstance 方法创建 Class 对象对应类的实例通过这种方式可以选定构造方法创建实例。
创建对象的具体代码如下
//1.1获取 Persion 类的 Class 对象
Class clazz Class.forName(hello.java.reflect.Persion);
//1.2使用 newInstance 方法创建对象
Persion p (Persion) clazz.newInstance();
//2.1获取构造方法并创建对象
Constructor c clazz.getDeclaredConstructor(String.class,String.class,int.class);
//2.2根据构造方法创建对象并设置属性
Persion p1 (Persion) c.newInstance(李四,男,20);1.3.7 Method 的 invoke 方法
Method 提供了关于类或接口上某个方法及如何访问该方法的信息那么在运行代码中如何动态调用该方法呢答案是通过调用 Method 的 invoke 方法实现。通过 invoke 方法可以实现动态调用比如可以动态传入参数并将方法参数化。具体过程获取 Method 对象并调用 Method 的invoke 方法如下所述
获取 Method 对象通过调用 Class 对象的 getMethod(String name,Class? … parameterTypes) 返回一个 Method 对象它描述了此 Class 对象所表示的类或接口指定的公共成员方法。name 参数是 String 类型用于指定所需方法的名称。parameterTypes 参数是按声明顺序标识该方法的形参类型的 Class 对象的一个数组如果 parameterTypes 为 null则按空数组处理。调用 Method 的 invoke 方法通过调用 Method 对象的 invoke 方法来动态执行函数。invoke 方法的具体使用代码如下
//1.获取 Persion 类hello.java.reflect.Persion的 Class 对象
Class clz Class.forName(hello.java.reflect.Persion);
//2.获取 Class 对象中的 setName 方法
Method method clz.getMethod(setName, String.class);
//3.获取 Constructor 对象
Constructor constructor clz.getConstructor();
//4.根据 Constructor 定义对象
Object object constructor.newInstance();
//5.调用 Method 的 invoke 方法这里的 Method 表示 setName 方法
//因此相当于动态调用 object 对象的 setName 方法并传入 alex 参数
method.invoke(object,alex);以上代码首先通过 Class.forName 方法获取 Persion 类的 Class 对象然后调用 Persion 类的 Class 对象的 getMethod(“setName”,String.class) 获取一个 Method 对象接着使用 Class 对象获取指定的 Constructor 对象并调用 Constructor 对象的 newInstance 方法创建 Class 对象对应类的实体最后调用 method.invoke 方法实现动态调用这样就通过反射动态生成类的对象并调用其方法。 相关面试题
Java 反射机制的作用是什么★★★☆☆Java 反射机制创建对象的方式有哪些★★☆☆☆Java 是如何实现动态调用某个方法的★☆☆☆☆通过 Java 反射创建对象和通过 new 创建对象哪个效率更高★☆☆☆☆除了可以使用 new 方法创建对象还可以使用什么方法创建对象★☆☆☆☆