闭包与反射
文章目录
1)Java中的闭包
2)Java反射机制
Java中的闭包
- 通过"接口+内部类"实现
- 内部类
- 将一个类定义在另一个类的内部。
- 内部类可以访问到外围类的变量、方法或者其他内部类等所有成员。
- 外部类不能访问内部类中的变量。
- 通过外围类的实例创建内部类。
{外围类的实例}.new 内部类
- 通过
{外围类名}.this.{变量名称}
显示引用外围类的变量
- 局部内部类
- 在方法的作用域内定义的内部类
- 在方法的外围是不可见的
- 匿名内部类
- 匿名,没有名字的内部类
- 通过new关键字来创建
new 接口名称(){}
- 没有名称,不能重载
- 闭包所绑定的本地变量必须使用final修饰符
- 可以再方法体内定义一下新的final局部变量,然后把参数赋值给他。
Java反射机制
- 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性
- 反射就是把java类中的各种成分映射成一个个的Java对象,利用反射机制可以获取所需的私有成员或是方法
- 获取Class对象的三种方式
a. Object ——> getClass();
b. 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
c. 通过Class类的静态方法:forName(String className)
(常用) - 1.获取构造方法并调用
- 1.获取构造方法:
-
1).批量的方法:
public Constructor[] getConstructors()
:所有公有 构造方法
public Constructor[] getDeclaredConstructors()
:获取所有的构造方法 -
2).获取单个的方法:
public Constructor getConstructor(Class... parameterTypes)
:单个的公有的构造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes)
:获取某个构造方法
-
- 2.调用构造方法:
- 调用
newInstance
,它是 Constructor类的方法
- 调用
- 2.获取成员变量并调用
getFields()
:获取成员变量 Class类的方法 、class文件中的所有公共的成员变量;返回值是Field[] Field类描述成员变量对象的类
Field getField(传递字符串类型的变量名)
:获取指定的成员变量 String name;Class类的方法 获取指定的成员变量
void set(Object obj, Object value)
:Field类的方法 ,修改成员变量的值;Object obj 必须有对象的支持, Object value 修改后的值 - 3.获取成员方法并调用
.getDeclaredMethod("show4", int.class)
:调用所有指定方法,需要传入两个参数,第一个是调用的方法名称,第二个是方法的形参类型。
.invoke(obj, 20)
; :让反射到的一个方法运行,需要两个参数,一个是要调用的对象(获取有反射),一个是实参