Java代码经历的三个阶段:
反射
1、概念:将类的各个组成部分封装为其他对象,这就是反射机制。
2、好处:
(1)、可以在程序运行过程中操作这些对象。
(2)、可以解耦,提高程序的扩展性
3、获取Class对象的方式
(1)、class.forName("全类名"):将字节码文件加载进内存返回class对象 ---> 多用于配置文件,将类名可以定制配置文 件中,读取文件,加载类
(2)、类名.class:通过类名的属性class获取 ----> 多用于参数的传递
(3)、对象.getClass() :getClass()方法在Object类中定义着。 ---->多用于对象获取字节码的方式
4、结论:
同一个字节码文件(*.class),再一次程序运行过程中,只会被加载一次,无论是哪种方式获取的class对象都是同一个。
5、Class的功能
(1)、获取功能
-
-
Field[]
getFields()
获取所有public修饰的成员变量 Field
getField(String name)
获取指定的public修饰的成员变量 Field[]
getDeclaredFields()
获取所有的成员变量 Field
getDeclaredField(String name)
获取指定的成员变量
Field成员变量: 1、获取值: Object get(Object obj); 2、设置值:void set(Object obj, Object value); 3、当通过反射给成员变量赋值的时候,若成员变量为private修饰的,需要设置下方的方法: field.setAccessible(true); 暴力反射 ---> 忽略访问权限修饰符的安全检查
-
(2)、获取构造方法(Constructor)
创建对象: T newInstance(Object... initargs) 如果构造使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance()方法
(3)、获取成员方法(Method)
方法和(1)雷同
getMethod()获取所有的方法时候可能会有一些隐藏的方法,例如Object的一些方法。
执行方法 Object invoke(Object obj, Object... args) 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。 方法.invoke(对象 , 实际参数) 获取方法名: 方法.getName();
(4)、获取类名
Class class=对象.getClass();
class.getName(); 全类名
6、案例学习
properties 对象通过load()方法加载文件,装换成一个集合。 获取文件class目录下的配置文件的方式: 通过类加载器获取:类名.class.getClassLoader(); --->可以找到类下的class文件