反射:将类的各个组成部分封装为其他 对象 这就是反射机制
好处:
1:在程序运行过程中操作这写对象 例如:idea 我们可以快速知道 类中的方法
2:解耦 填好 程序的可扩展性
1:获取class 对象的方式
1;Class.forname("全类名")
1.1:多用于配置文件 将类名配置在文件中 加载力
2:通过类名的属性获取 类名.class
2.1: 多用于参数传参
3:对象.getClass() :getClass()在obect中定义的
3.1 多用于字节码对象获取
结论:
同一个字节码文件(*.class)在一次程序运行过程中 只会被加载一次 不论通过哪一种 方式获取class 对象都是一个
=======================
2;Class对象功能
1:获取成员变量们
1.1getFields()获取所有public 修饰的成员变量
1.2getField(string name)获取某个 public 修饰的 成员变量
1.3:getDeclaredFields()获取所有的成员变量 不考虑修饰符
1.4:getDeclaredField(string name)
2;获取构造方法们
2.1" getConstrusctors()
2.2 getConstrusctor(类名)
2.3 getDeclaredConstrusctors()
2.4 2.3 getDeclaredConstrusctor(类名)
3:获取成员方法们
3.1 getMehods();
3.2 getMehod(string f方法名,类名);
3.3 getDeclaredMehods()
3.3 getDeclaredMehod (string f方法名,类名)
4:获取类名
getName();
=============
Field 成员变量
操作: 修饰的 成员变量
obj:一般都是 Field所属的类的 类对象
1:设置值: void set(Object obj,Object value)
2: 获取值 get(Object obj)
3;忽略访问对象修饰符安全检查 setAccessible(true) 暴力反射
操作: 获取所有的成员变i量
如果获取的是 私有修饰符的 成员变量 需要 忽视修饰符的安全检查
setAccessible(true) 暴力反射
=============
Construsctor :获取构造方法
操作
1:创建 对象 new instance(Object ...)
如果构造函数中需要参数 (string name,int age)等等参数
在使用反射创建构造函数 需要传递 参数的类型的class l例如:
String.class, int.class
===============
Method 方法对象
1:执行方法 method.invok(Object ob, Object...args)
2:获取方法名称
method.getName();
案例1
创建配置 文件
2:加载配置文件获取信息 3:使用反射执行方法
网友评论