Java底层知识-JVM
一、谈谈你对Java的理解
1、平台无关性
2、面向对象
3、GC
4、类库
5、语言特性
6、异常处理
二、如何实现平台无关性
1、编译时、运行时
(1)Java源码首先被编译成字节码,即.class文件里面的字节码,再由不同平台上的JVM进行解析,Java语言在不同平台上运行时不需要进行重新编译,JVM在执行字节码的时候,把字节码转换成具体平台上的机器指令。
2、为什么JVM不直接将源码解析成机器指令去执行?
(1)准备工作:每次执行都需要各种检查(语法、语义的检查),减慢系统的性能
(2)在编译成字节码后不需要多次编译,JVM每次只需执行这个字节码文件即可
(3)兼容性:也可以将别的语言解析成字节码
3、如何查看字节码
(1)命令:Javap -c ![image-20200928174308798](https://i-blog.csdnimg.cn/blog_migrate/470164aa557b56eb2ed2d8dad3e01689.png)
三、JVM如何加载.class文件
1、JVM的架构
(1)Class Loader:依据特定格式,加载class文件到内存中
(2)Execution Engine:对命令进行解析(解析字节码)
(3)Native Interface:融合不同开发语言的原生库为Java所用
(4)Runtime Data Area:JVM内存空间结构模型
四、反射机制
1、基本概念:
–运行状态中,对于任意一个类
–都能知道这个类的所有方法
–对于任意一个对象
–都能调用它的任意方法和属性
–这种动态获取类的信息、eg:属性、方法、构造方法
–以及动态调用对象方法的功能称为Java语言的反射机制
(1)理论性回答:
Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有方法和属性,并且对于任意一个对象,都能调用它的方法和属性,这种能够动态获取类的信息以及动态调用对象方法的功能称为Java的反射。
(2)相关类库使用
自定义Robot类
public class Robot {
private String name;
public void sayHi(String helloSentence){
System.out.println(helloSentence + " " + name);
}
private String throwHello(String tag) {
return "Hello" + tag;
}
}
反射例子
package com.mrbin.javabasic.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射简单使用:获取一个类中的属性和方法,以及调用实例对象的方法
*/
public class ReflectSample {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class rc = Class.forName("com.mrbin.javabasic.reflect.Robot");
Robot rb = (Robot) rc.newInstance();
System.out.println("Class name is " + rc.getName());
// getDeclaredMethod(); ----可获取该类的所有方法,但是不能获取超类和接口的方法
Method getHello = rc.getDeclaredMethod("throwHello", String.class);
// private 方法要设置为true
getHello.setAccessible(true);
Object str = getHello.invoke(rb, "MrBin");
System.out.println("Get Hello result is " + str);
// getMethod(); -----能获取该类的public的方法,还能获取超类的public方法以及实现的接口方法
Method sayHi = rc.getMethod("sayHi", String.class);
sayHi.invoke(rb, "Welcome");
// 用Field 对象 获取私有字段
Field name = rc.getDeclaredField("name");
name.setAccessible(true);
name.set(rb, "MrBin");
sayHi.invoke(rb, "Welcome");
}
}
五、ClassLoader
1、类从编译到执行的过程
(1)编译器将Robot.java 文件编译为Robot.class字节码文件
(2)ClassLoader将字节码转换为JVM中的Class对象
(3)JVM利用Class对象实力化为Robot对象
2、ClassLoader的作用
(1)ClassLoader在Java中的作用非常重要,它主要工作在Class装载的加载阶段,他主要作用是从系统外部获得Class二进制数据流。
(2)
–是Java的核心组件
–所有的Class都是由ClassLoader加载
–ClassLoader负责将Class文件里的二进制数据装载进系统
–然后交给Java虚拟机进行连接、初始化等操作
3、ClassLoader的种类
(1)BootStrapClassLoader:C++编写,加载核心库 eg:Java.*(先有它加载核心类,再有其他ClassLoader)
(2)ExtClassLoader:Java编写,加载扩展库javax.*(可以放入自己的拓展类到这里面的目录进行加载)
(3)AppClassLoader:Java编写,加载程序所在目录(ClassPath)
(4)自定义ClassLoader:Java 编写,订制化加载
4、自定义ClassLoader的实现
(1)关键函数
ssPath)