Java语言到底是什么?

1,600 阅读4分钟

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

首先,Java是我们常用的开发语言,但是它是跨平台使用的,所以在使用的过程中;

Java Virtual Machine  Java虚拟机,实现在虚拟机上运行

  这里就出现一个问题:

 1.JDK和JRE以及JVM三者的关系:

JDK(Java Development kits):Java开发工具包。

JRE(Java Runtime Environment):Java运行环境。

JVM(Java Virtual Machine):Java虚拟机。

JDK = JRE + 开发工具(javac.exe,java.exe,javadoc.exe等)

JRE = JVM + 核心类库(常用类:String、日期时间、数学、集合、IO、网络、多线程等)

也就说,Java源程序,经过Javac.exe的编译,然后进入到jvm的解释器中去运行,

2.Java打包成Jar供给项目部署:

Java程序,一般在项目使用过程中,会打包中Jar包或者是War包

因为前后端分离的项目,所以前端一般都是war包,包含web端,后端一般是Jar包;

jar就是多个class的二进制文件包(Java Archine)java的归档文件

jar包中的目录是怎样的:

meta-INF  是maven的打包的工具

org-   基于框架spring,springboot启动的一些二进制文件

boot-info   依赖的包,以及源代码的编译好的二进制文件.class文件

3.加载到内存中后,jvm会执行自己的字节码引擎,开始执行处理,

(需要哪个类,这个类就会加载),直至异常或者完成

课后小问题:

4.Java可以经过Javac编译成二进制的文件class,要是反编译是不是就可以拿到代码了?

解答:

可以编译,就可以反编译,因为Java有反射机制,所以反编译自然而然就可以,但是jar包的反编译之后可能会失去泛型,注释等东西

我们已经了解因为jvm只处理二进制class的文件,所以源代码经过编译成为二进制的class的字节码文件后,加载到jvm中经过了什么?blog.csdn.net/qq_36522306…

2.本此的主题就是类的加载过程中,jvm做了什么

3.类什么时候会加载, 在jvm执行时,需要的时候,会加载进来;

加载

之后,会遇到几个过程,比如

1.1加载此类:(根据类加载器实现类的加载)

1.2 验证-->准备-->解析

  • 验证当前加载的class字节码文件,是否合法,是否被篡改等,
  • 准备,类加载之前,有开辟内存空间,加载静态成员变量(static修饰的),初始话默认值即可,八种基础数据类型,引用类型就是null
  • 解析: 符号引用替换为直接引用(换成真正的内存引用)

1.3 初始化

这个阶段,一般是将类中的静态变量,静态代码块以及父子类的静态域加载

比如我们要实例化一个对象,new Boy(),这个类会被先加载-->一系列进行类初始化,如果这个时候发现父类也没有加载,会优先加载和初始化父类,然后就会才会实例new出对象

package com.atlucas.creation.prototype;

/**
 * @author lucas
 * @create 2021-06-25 9:39
 * @description
 */
public class TestClassloader {
    public static void main(String[] args) {
        
        
        String s=new String();
        Class<String> stringClass = String.class;

        ClassLoader classLoader = stringClass.getClassLoader();

        System.out.println("TestProtoType此类的类加载器是"+TestProtoType.class.getClassLoader());
        System.out.println("String此类的类加载器是"+String.class.getClassLoader());

        /**
         * String此类的类加载器是sun.misc.Launcher$AppClassLoader@18b4aac2
         * String此类的类加载器是null
         */
    }
}

2.类加载器:

2.1 Bootstrap  classloader (启动类加载器)

主要负责Java核心类,Java.lang包等核心库中的类一般存放的位置在JDK /lib中

2.2 Extension ClassLoader(扩展类加载器) 

 java 安装目录中有一个lib/ext中的库 主要加载其中的这类;属于核心类库的一个拓展加载;

2.3 Application Classloader(应用程序类加载器): 

主要是本地写好Java本地类,这个类加载器就是负责将自己写好的类加载到内存中;

2.4(自定义类加载器)根据自身需求去加载你的类

使用比较多就是关于一般是应用程序类加载器以及启动类加载器

这里我们引入一个新的概念--双亲委派机制,

3.双亲委派机制: 

因为之前我了解过:本质: 需要加载类的时候,子类加载器优先会提前让父类加载器加载,是从下往上找,从上往下加载的过程,目的是为了防止重复加载,

如果是jar包人家反编译--很可能会获取到源代码,但是市面上现有有第三方的基于字节码的加密工具,可以考虑加密