反射or线程

反射

什么是反射

  • 反射是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提供的用于管理线程池的类
  • 线程池有两个主要作用:
    控制线程数量
    重用线程
  • 当一个程序中若创建大量线程,并在任务结束后销毁会给系统带来过度消耗资源,以及过度切换线程的危险,从而可能导致系统崩溃,为此我们应使用线程池来解决这个问题
  • 线程池的概念:首先创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务玩后不关闭该线程,而是将该线程还回到线程池中.
  • 在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,他就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程
  • 一个线程只能执行一次任务,但可以同时向一个线程池提交多个任务

线程池有以下几种实现策略

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值