p715-735
反射调用速度慢
反射调用优化-关闭访问检查
1. Method和Field、Constructor对象都有setAccessible()
方法2. setAccessible作用是启动和禁用访问安全检查的开关
3.参数值为true表示反射的对象在使用时取消访问检查,提高反射的效率。参数值
为false则表示反射的对象执行访问检查
Class类
1.Class也是类,因此也继承Object类
2. Class类对象不是new出来的,而是系统创建的
3.对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
4.每个类的实例都会记得自己是由哪个Class 实例所生成
5.通过Class可以完整地得到一个类的完整结构,通过一系列API
6. Class对象是存放在堆的
7.类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,变量名,方法名,访问权限等等)
意思是一个在内存,一个在磁盘
获取Class对象
GetClass_.java
1.前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException,实例: Class cls1 =Class.forName( "java.lang.Cat" );
应用场景:多用于配置文件,读取类全路径,加载类.
2.前提:若已知具体的类,通过类的class 获取,该方式最为安全可靠,程序性能最高
实例: Class cls2 = Cat.class;
应用场景:多用于参数传递,比如通过反射得到对应构造器对象.
3.前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象,实例:
Class clazz =对象.getClass():;//运行类型
应用场景:通过创建好的对象,获取Class对象.
4、其他方式
ClassLoader cl =对象.getClass().getClassLoader);Class clazz4 = cl.loadClass(“类的全类名”);
5.基本数据(int, char,boolean,float,double,byte,long,short)按如下方式得到Class类
对象
Class cls=基本数据类型.class
6.基本数据类型对应的包装类,可以通过.TYPE得到Class类对象
Class cls =包装类.TYPE
哪些类有class对象
8.Class类自己也有
9.线程
类加载
三个阶段
1.加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象,此过程由类加载器完成
2.连接:将类的二进制数据合并到JRE中
验证:对文件的安全性进行校验
准备:对静态变量进行默认初始化并分配空间
解析:把符号引用转化成直接引用(GPT的解释)
符号引用:
符号引用是一种间接引用方法,其中使用符号(如变量名、函数名或标签)来访问内存中的数据或代码。编译器或解释器会将这些符号解析为具体的内存地址或指令地址。
特性:
- 抽象性:符号引用提供了一种更高层次的抽象,使程序员可以使用易读的名字而不是具体的内存地址。
- 灵活性:符号引用允许编译器和链接器在编译时和链接时进行优化和地址重定位。
- 安全性:通过使用符号,程序员可以避免直接操作内存地址,减少出错的机会。
直接引用:
直接引用是一种直接通过内存地址访问数据的方法。也就是说,代码中使用的地址是实际的内存地址,这通常出现在低级编程(如汇编语言)或特定的优化场景中。
特性:
- 高效性:直接引用通常比符号引用更高效,因为它省去了解析符号的步骤。
- 风险性:直接操作内存地址容易导致错误,如内存越界、段错误等,因此需要程序员小心处理。
- 不灵活:由于使用的是硬编码的内存地址,代码的可移植性和可维护性较差。
3.初始化:jvm负责对类进行初始化,这里主要是指静态成员
注意,这里是指类加载,不是创建对象!!
详细说明
1加载:
JVM在该阶段的主要目的是将字节码从不同的数据源(可能是 class文件、也可能是jar包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class 对象
2.1连接-验证:
1.目的是为了确保Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不
会危害虚拟机自身的安全。
·2.包括:文件格式验证(是否以魔数oxcafebabe开头)、元数据验证、字节码验证和
符号引用验证
3.可以考虑使用-Xverify:none 参数来关闭大部分的类验证措施,缩短虚拟机类加载
的时间。
2.2连接-准备:
JVM 会在该阶段对静态变量,分配内存并默认初始化(对应数据类型的默认初始
值,如0、OL、null、false 等)。这些变量所使用的内存都将在方法区中进行分配
2.3连接-解析
虚拟机将常量池中的符号引用替换为直接引用的过程
3.初始化
1.到初始化阶段,才真正开始执行类中定义的Java程序代码,此阶段是执行<clinit>()方法的过程。
2. <clinit>()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有
静态变量的赋值动作和静态代码块中的语句,并进行合并。
3.虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果
多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕
通过反射获取类的结构信息
![](https://i-blog.csdnimg.cn/direct/d04e5d151c1947deb0c6c0f4850f2e39.png)
通过反射创建对象
1.方式一:调用类中的public修饰的无参构造器
2.方式二:调用类中的指定构造器
3. Class类相关方法
newlnstance:调用类中的无参构造器,获取对应类的对象
getConstructor(Class...clazz):根据参数列表,获取对应的构造器对象
getDecalaredConstructor(Class...clazz):根据参数列表,获取对应的构造器对象
4.Constructor类相关方法
-setAccessible:暴破
- newlnstance(Object...obj):调用构造器
通过反射访问类中的成员
MySql安装
配置文件:
管理员运行cmd后进入到sql的文件夹下:
cd /D path
安装成功了!明天来吧