Android进阶解密读书笔记(十)——Java虚拟机

一、Java虚拟机的执行流程

Java虚拟机执行流程分为两大部分:编译时环境和运行时环境,当一个Java文件经过Java编译器编译后会生成class文件,这个class文件会由Java虚拟机来进行处理

Java虚拟机与Java语言没有什么必然的联系,它只与特定的二进制文件:Class文件有关;因此无论任何语言只要能编译成Class文件就可以被Java虚拟机来处理

二、Java虚拟机结构

Java虚拟机结构包括运行时数据区域、执行引擎、本地库接口和本地方法,其中类加载子系统并不属于Java虚拟机的内部结构1

1、Class文件格式

java 文件被编译后生成了Class文件,这种二进制格式的文件不依赖于特定的硬件和操作系统。每一个Class文件中都对应着唯一的类或者接口定义信息,但是类或者接口并不一定定义在文件中,比如类和接口可以通过类加载器来直接生成

2、类的生命周期

一个Java文件被加载到Java虚拟机内存中到从内存中卸载的过程被称为类的生命周期。类的生命周期包括的阶段分别是:加载、链接、初始化、使用和卸载,其中链接包括了三个阶段:验证、准备和解析。各个阶段所做的工作如下:

  1. 加载:查找并加载class文件
  2. 链接:包括验证准备和解析
    验证:确保被导入类型的正确性
    准备:为类的静态字段分配字段,并用默认值初始化这些字段
    解析:虚拟机将常量池内的符号引用替换为直接引用
  3. 初始化:将类变量初始化为正确的初始值

根据《深入理解Java虚拟机》的描述,加载阶段(不是类的加载)主要做了3件事情

  • 根据特定名称查找类或接口类型的二进制字节流
  • 将这个二进制字节流所代表的静态存储结果转化为方法区的运行时数据结构
  • 在内存中生成一个代表这个类的 java.lang.class 对象,作为方法区这个类的各种数据结构的访问入口

3、类加载子系统

类加载子系统通过多种类加载器来查找和加载 Class 文件到 Java 虚拟机中,Java虚拟机有两种类加载器:系统加载器和自定义加载器,其中系统加载器包括以下三种:

  1. Boots
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个示例的完整代码,用于在Android中使用Java实现AES加密和解密: ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; public class AESUtil { private static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding"; private static final String CHARSET = "UTF-8"; private static byte[] encrypt(byte[] key, byte[] initVector, byte[] value) { try { SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(initVector); Cipher cipher = Cipher.getInstance(AES_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); return cipher.doFinal(value); } catch (Exception e) { e.printStackTrace(); } return null; } private static byte[] decrypt(byte[] key, byte[] initVector, byte[] encrypted) { try { SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(initVector); Cipher cipher = Cipher.getInstance(AES_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); return cipher.doFinal(encrypted); } catch (Exception e) { e.printStackTrace(); } return null; } public static String encrypt(String key, String initVector, String value) { try { byte[] encrypted = encrypt(key.getBytes(CHARSET), initVector.getBytes(CHARSET), value.getBytes(CHARSET)); return Base64.encodeToString(encrypted, Base64.DEFAULT); } catch (Exception e) { e.printStackTrace(); } return null; } public static String decrypt(String key, String initVector, String encrypted) { try { byte[] decoded = Base64.decode(encrypted, Base64.DEFAULT); byte[] decrypted = decrypt(key.getBytes(CHARSET), initVector.getBytes(CHARSET), decoded); return new String(decrypted, CHARSET); } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 使用示例: ```java String key = "0123456789abcdef"; // 16字节的密钥 String initVector = "ABCDEF0123456789"; // 16字节的初始向量 String originalText = "Hello, AES!"; String encryptedText = AESUtil.encrypt(key, initVector, originalText); String decryptedText = AESUtil.decrypt(key, initVector, encryptedText); System.out.println("Original Text: " + originalText); System.out.println("Encrypted Text: " + encryptedText); System.out.println("Decrypted Text: " + decryptedText); ``` 请注意,这只是一个简单的示例代码,并不涵盖所有的错误处理和最佳实践。在实际使用中,请根据需要进行适当的异常处理和安全性考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值