Java底层知识-JVM

Java底层知识-JVM

一、谈谈你对Java的理解

1、平台无关性

2、面向对象

3、GC

4、类库

5、语言特性

6、异常处理


二、如何实现平台无关性

1、编译时、运行时

image-20200928172730952

(1)Java源码首先被编译成字节码,即.class文件里面的字节码,再由不同平台上的JVM进行解析,Java语言在不同平台上运行时不需要进行重新编译,JVM在执行字节码的时候,把字节码转换成具体平台上的机器指令。

2、为什么JVM不直接将源码解析成机器指令去执行?

(1)准备工作:每次执行都需要各种检查(语法、语义的检查),减慢系统的性能
(2)在编译成字节码后不需要多次编译,JVM每次只需执行这个字节码文件即可
(3)兼容性:也可以将别的语言解析成字节码

3、如何查看字节码

(1)命令:Javap -c image-20200928174308798

三、JVM如何加载.class文件

1、JVM的架构

image-20200928193131284

(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)关键函数

image-20201006164254563

image-20201006164319057

ssPath)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值