这里写目录标题
反射
什么是反射
- 反射是java系统的API
- 它允许程序在运行过程中取得任何一个已知名称的类内部信息,包括其中的构造方法.声明的字段和定义的方法等
- 利用反射API可以实现动态执行:
– 动态创建对象
– 动态加载类
– 动态访问属性
– 动态调用方法 - 动态执行:只是在JVM运行期间才确定的执行次序
- 静态执行:是指编译以后就确定了程序的运行次序,JVM运行期间按照既定的次序执行
反射API
- java反射API提供了动态执行能力
- Class API
– java.lang.Class类,用于加载类和获取类的相关信息 - java反射API位于java.lang.reflect包中.主要包括以下类:
– Constructor类:用于描述一个类的构造方法
– Field类:用于描述一个类的成员变量
– Method类:用于描述一个类的方法
– Modifier类:用于描述类内各元素的修饰符
– Array:用于对数组进行操作
动态加载类
Class.forName()
动态加载类到内存方法区:
Class cls=Class.forName(类名)
- 类名是运行期间动态输入的类名,可以任何类名
- 返回值是一个引用,利用这个引用指向的对象可以访问方法区中的类信息
- 如果类名是错误的将出现"类没有找到"的异常
案例
动态创建对象
newInstance()
Class提供了动态创建对象的方法:
Object newInstance()
- newInstance方法将调用类信息中的无参构造器创建对象,如果没有无参数构造器,将抛出没有方法的异常.
- 如果需要调用有参数构造器,可以利用Constructor API实现
- 返回值应用动态创建的对象,因此可以是任何类型的对象,所以其类型为Object
案例
动态调用方法
动态发现方法
- Class提供了方法可以动态获取类的全部方法信息:
Method[ ] getDeclaredMethods() - Method代表方法信息,可以利用Method API获取方法对详细信息,如:方法名,返回值类型,参数类型列表等.
- 这个方法返回对数组代表当前类中对全部方法信息,每个元素代表一个方法信息.
动态执行方法
- Method提供了动态执行一个方法的方法:
Object invoke(Object obj,Object… args)
- obj代表一个对象,该对象上一定包含当前方法!否则将出现调用异常;如果obj为null则抛出空指针异常
- args代表调用方法时候传递的实际参数,如果没有参数可以不用或者传递null,但是要走注意参数的个数和类型必须和要调用的方法匹配,否则出现参数错误异常
- 返回值表示方法执行的结果,因为可能是任何类型,则其类型为Object,调用没有返回值的返回值为null;
- 当方法调用方法执行出现异常时候抛出Invocayion TargetException\
执行不可访问方法
- 如果利用反射API调用了没有可访问权限时候回抛出异常:
IllegalAccessException,表示没有访问权限 - 但是在Method方法上表示提供了解除访问权限的方法:
setAccessible(boolean flag) - 在invoke之前使用这个方法可以解除访问权限,实现访问没有权限的方法.
线程池
使用ExecutorService实现线程池
- ExecutorService是java提供的用于管理线程池的类
- 线程池有两个主要作用:
– 控制线程数量
– 重用线程 - 当一个程序中若创建大量线程,并在任务结束后销毁会给系统带来过度消耗资源,以及过度切换线程的危险,从而可能导致系统崩溃,为此我们应使用线程池来解决这个问题
- 线程池的概念:首先创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务玩后不关闭该线程,而是将该线程还回到线程池中.
- 在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,他就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程
- 一个线程只能执行一次任务,但可以同时向一个线程池提交多个任务