异常、反射、注解、内部类、泛型、序列化、复制详解
一、异常
概念:某个方法不能按照正常途径完成任务,就会抛出一个封装错误信息的对象。此时,这个方法马上退出并不返回任何值。同时,这个方法内的其它代码也无法执行。异常处理机制将代码交给异常处理器。
分类
Throwable是Java中所有错误或异常的超类,下一层为Exception和Error
Error:java运行时系统的内部错误和资源耗尽错误,又称内存异常,无法抛出该类对象,只能尽力使程序安全终止
Exception分为RuntimeException和CheckedException
RuntimeException:java虚拟机正常运行期间抛出的异常的超类,一定是程序员的错误,运行时报错
CheckedException:外部错误,发生在编译期间,编译器强制程序捕获,要求把异常程序try catch,最顶级JVM
异常处理方式
1.try-catch-finally
2.遇到问题抛给调用者(throw,throws)
抛出异常的形式:throw,throws,系统自动抛出异常
默认为throws处理方式
throw和throws的区别
1.throws用在函数上,后跟异常类,可以跟多个;throw 用在函数内,后面跟异常对象
2.throws用来声明异常,让调用者只知道该功能可能出现问题;throw抛出异常具体的问题对象,执行到throw,功能就结束了
3.throws表示出现异常的一种可能性,不一定发生;throw抛出了异常,执行后一定抛出异常对象
4.两者都是消极处理,只是抛出或者可能抛出,真正处理由函数上层调用处理
案例
//如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
Scanner scanner=new Scanner(System.in);
int num=0;
String inputStr="";
while (true){
try {
System.out.println("请输入一个整数:");
inputStr= scanner.next();
num=Integer.parseInt(inputStr);
break;
} catch (NumberFormatException e) {
System.out.println("你输入的不是一个整数");
}
}
System.out.println("输入的整数为:"+num);
二、反射
概念
反射机制:运行状态中,对于任意一个类都能够知道这个类的所有的属性和方法;对于任意一个对象,都能调用它的任意一个方法
从反射角度说,Java属于半动态语言。
动态语言:程序在运行时可以改变其结构。
需求
通过外部文件配置,在不修改源码情况下,来控制程序,符合设计模式的opc原则
应用场景
Java程序中许多对象都出现两种类型。
Person p=new Student();
编译类型为Person,运行时类型为Studen 编译时类型无法获取具体方法。程序在运行时还可能收到外部传入的对象,该对象编译时类型为Object,但程序有需要调用该对象的运行时类型的方法。为了解决这个问题,程序需要在运行时发现对象和类的真实信息。若编译时无法预知该对象和方法属于哪些类,程序只能依靠运行时信息发现该对象和类的真实信息,这时必须使用反射。
反射使用步骤
1.获取Class对象(反射的核心)
使用Class类中forName()静态方法(最安全/性能最好)
2.调用对象方法(反射的使用阶段)
//获取Person类的Class对象
Class clazz=Class.forName("reflection.Person");
//获取Person类的所有方法信息
Method[] method =clazz.getDeclaredMethods();
for(Method m:method){
输出(m.toString());
}
//获取Person类的所有成员属性信息
Field[] field=clazz.getDeclaredFields();
for(Field f:field){
输出(f.toString());
}
//获取Person类所有构造方法信息
Constructor[] constructor=clazz.getDeclaredConstructors();
for(Constructor c:constructor){
输出(c.toString());
}
创建对象的方法
1.Class对象的newInstance()
2.调用Constructor对象的newInstance()方法
先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法创建Class对象对应类的实例,通过这种方法可以选定方法创建实例
Class clazz=Class.forName("reflection.Person");
//使用newInstance方法创建对象
Person p=(Person) clazz.newInstance();
//使用构造器方法创建对象
Constructor c =clazz.getDeclaredConstructors(String.class,String.class,int.class);