- 经验
- 7
- 分贝
- 0
- 家园分
- 17
- 在线时间:
- 0 小时
- 最后登录:
- 2021-6-7
- 帖子:
- 6
- 精华:
- 0
- 注册时间:
- 2015-12-14
- UID:
- 1179472
注册:2015-12-14
|
[size=1.25em]####类加载器 概念:类加载器负责把.class字节码文件加载到内存中,生成方法区中存储的字节码对象。
字节码对象中封装了什么东西? 成员变量和成员方法
Java代码 -编译-> 字节码文件 -运行(类加载器把字节码文件变成字节码对象)-> 虚拟机中运行
类什么时候被加载?第一次用的时候
一个类被加载到内存中,只会生成一个字节码对象。
不管这个类创建了多少个此类对象,都只会有一个字节码对象。
Class 代表 类的类。 Java中任何一个类的字节码对象都是Class类的对象。
Student -生成-> Student.class对象 <-- Class类加载器的功能 🚩类加载器:快速的获取当前模块下src目录下的文件!!(系统类加载器加载文件的相对路径的起点是src的根目录)
static ClassLoader getSystemClassLoader():获取系统类加载器
InputStream getResourceAsStream(String name):name传入的是相对路径
相对路径的起点是当前模块的src的根目录
🚩 static InputStream getSystemResourceAsStream(String name):name传入的是相对路径
相对路径的起点是当前模块的src的根目录 反射 利用另一种方式去获取一个类的对象、调用类中的方法、使用类中的成员变量。
反射是基于正射。
正射: 对象.方法(实际参数)
反射: 方法对象.invoke(对象,实际参数)
反射代码的编写:
1、获取一个类的字节码对象 -> Class 类的类
字节码对象中封装了类中的构造方法、成员变量、成员方法
2、根据字节码对象获取类中相应的成员对象
根据字节码对象获取类中 构造方法的对象 -> Constructor
根据字节码对象获取类中 成员方法的对象 -> Method
根据字节码对象获取类中 成员变量的对象 -> Field
3、根据不同的成员对象完成不同的功能
构造方法对象 -> 创建此类的对象
成员变量对象 -> 赋值、获取值
成员方法对象 -> 调用方法如何获取一个类的字节码对象 1、对象.getClass() -> 这个对象所在类的字节码对象
Class getClass():来自Object类
2、类型.class -> 类型的名称.class 可以获取到此类型的字节码对象
Class clazz = String.class;
Class clazz = int.class;
Class clazz = Student.class;
3、Class.forName("类的全类名"); -> 通过一个Class的静态方法获取一个类的字节码对象
Class clazz = Class.forName("java.lang.String");
Class clazz = Class.forName("com.itheima.Student");
这三种哪种用的舒服就优先用哪个!!根据字节码对象获取类中的成员构造方法 获取一个类中的构造方法对象的方法来自于Class类:
Constructor[] getConstructors():获取一个类中所有被public修饰的构造方法对象
Constructor getConstructor(Class...parameterTypes):获取一个类中指定的被public修饰的构造方法对象
🚩 Declared:忽视修饰符
Constructor[] getDeclaredConstructors():获取一个类中所有的构造方法对象
Constructor<T> getDeclaredConstructor(Class... parameterTypes):获取一个类中指定的构造方法对象
Class类中有一个快捷的生成一个类无参构造方法对象的方法
T newInstance():根据无参构造快速的创建一个该类的对象
来自于 Constructor 类的方法 来实现对象创建
T newInstance(Object...initargs)
Object...initargs:启动此构造方法时需要传入的实际参数
T: 你创建出来的这个对象
若要去访问类中私有成员,你必须使用成员对象开启暴力反射开关。
两种创建此类对象的方法
1、有字节码对象 --> 根据字节码对象获取相应的构造方法对象 --> 此构造方法对象调newInstance方法创建该类对象
(private修饰的构造方法记得打开暴力反射开关)
2、有字节码对象 --> 直接调用Class类中的newInstance方法创建该类的无参对象 成员变量 1、获取一个类的字节码对象
2、获取一个类中成员变量对象的方法来自于Class类
Field[] getDeclaredFields():获取一个类中所有的成员变量对象
Field getDeclaredField(String name):获取一个类中指定的成员变量对象
String name:变量的名字
3、赋值和取值 --> 来自于Field类
Object get(Object obj):取值
Object obj:哪一个对象的
void set(Object obj, Object value):赋值
Object obj:哪一个对象的
Object value:你要把这个参数的值设置为多少
⚠️: 当成员变量被私有,必须在使用前开启暴力反射成员方法 1、获取一个类的字节码对象
2、获取一个类中成员方法对象的方法来自于Class类
Method[] getDeclaredMethods():获取一个类中所有的成员方法对象
Method getDeclaredMethod(String name, Class... parameterTypes):获取一个类中指定的成员方法对象
String name:方法名 -> 写方法名字的时候不要加()
Class...parameterTypes:方法形式参数数据类型的字节码对象
3、有了方法对象 你就想启动方法 启动方法的方法在Method类中
Object invoke(Object obj, Object... args):启动方法
Object obj:具体调用方法的对象
Object... args:启动方法需要你传入的实际参数
Object:
如果方法有返回值:invoke方法的返回值就是用来接受调用方法的返回值的
如果方法没有返回值:invoke方法的返回值就是null
注意:
1、启动方法 如果启动的是无返回值的方法就直接调用invoke
2、因为启动的方法有返回值 所以调用invoke方法的时候记得接受调用
3、私有方法在启动之前记得开启暴力反射开关
|
|