Day24
一、反射(被称为框架的灵魂,在反射面前一切是裸体《简称什么都可以操作》)
1、反射就是将各个类每一部分封装成对象,(一切皆对象)Class对象
2、反射优点:可以修改正在运行的代码(热修复);所有框架的编写都是使用反射
3、三种方式获取Class对象:
(1)类名 对象名 = new 类名();Class Class对象名 = 对象名.getClass();《理解方式,不用》
- 获取Class对象名就是为了获取类的对象,第一种方式就是反过来
(2)Class Class对象名 = 类名.class;《了解,不用》
(3)Class Class对象名 = Class.forName(String className)参数是具体的包名+类名《常用》
二、Class类(用于反射)
1、Class没有公共构造方法,是由jvm自动构建
2、获取构造器的方法:
- public Constructor<?>[] getConstructors():获取所有的公有的构造;
- public Constructor<?>[] getDeclaredConstructors():获取所有的构造,包含私有;
- public Constructor getConstructor(Class<?>… parameterTypes):获取是一个公有的构造,参数是构造参数的数组,表示可以传入多个参数;
- public Constructor getDeclaredConstructor(Class<?>… parameterTypes):获取私有的构造方法;
- public T newInstance():表示实例化一个对象(Constructor类下也有,主要实例有参和私有构造);
1.带参数的的构造(或方法)传递的是==>(类型.class) 2.public static void setAccessible( boolean flag):暴力反射,使私有的构造、方法和属性能够被使用
3、获取方法的方法:
- public Method[] getMethods():获取所有公有的方法(同时也会获取到父类公有的方法);
- public Method[] getDeclaredMethods():获取所有的包括私有的方法(不包含父类的);
- public Method getMethod(String name,Class<?>… parameterTypes):获取单个公有的方法,第一个参数是方法的名称 第二个参数是方法类型.class;
- public Method getDeclaredMethod(String name,Class<?>… parameterTypes):获取私有的方法;
- public Object invoke(Object obj,Object… args):调用Obj对象的方法,在Method类下的,第一个参数 是对象 ,第二个参数是方法的具体参数;
获取类的私有属性、方法和构造的方法都含有Declared单词,都要进行暴力反射;在得到构造和方法的时候传递的都是类型.class,只有调用的时候传递的才是具体的值
4、获取属性的方法:
- public Field[] getFields():获取所有公有的属性;
- public Field[] getDeclaredFields():所有所有的属性(包含私有的);
- public Field getField(String name):获取单个公有的属性,参数:属性的名称;
- public Field getDeclaredField(String name):获取私有的属性;
5、Field类的方法:
- 设置值:public void set(Object obj,Object value):第一个参数是对象,第二个参数是具体赋的值;
- 取值: 第一种取值的方法Object obj = c2.newInstance(); Student student = (Student) obj;第二种取值的方法是:public Object get(Object obj):参数传递的是对象;