Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • java base
  • Java 面试高频问题指南
  • 其他

  • throwable
  • thread
  • weakreference
  • UnSafe
    • UnSafe
    • 示例
      • 操作对象属性
  • collections
  • Class
  • classloader
  • java
Jacky
2023-08-03
目录

UnSafe

# UnSafe

sun.misc.Unsafe是 Java 中的一个非公开类, 它提供了直接操作内存和执行一些不安全操作的功能。这个类在 Java 的核心库中, 并且不建议在生产环境中使用它, 因为它可以绕过 Java 的安全检查, 可能导致不安全的操作

Unsafe 类可以在 Java 代码中执行以下一些操作:

  • 直接操作内存: Unsafe 类可以直接操作对象的内存, 包括分配、读取和写入内存。这使得开发者可以绕过 Java 的安全检查, 直接操作对象的内部, 但也会增加出错的风险

  • 修改对象的成员变量: Unsafe 类可以获取对象成员变量在对象中的偏移量, 然后通过偏移量来访问和修改对象的成员变量。这个功能可以用于在运行时动态修改对象的状态, 但同样存在风险

  • 数组操作: Unsafe 类可以对数组进行内存操作, 包括分配、读取和写入数组元素。这使得开发者可以在底层直接操作数组, 但也容易导致越界访问和内存泄漏等问题

  • 线程同步: Unsafe 类提供了一些底层的线程同步操作, 如 CAS(Compare and Swap)等。这些操作可以用于实现自定义的锁和同步机制, 但使用不当可能导致线程安全问题

由于 Unsafe 类的功能非常强大, 但同时也非常危险, 因此它不是公开的 API, 一般情况下不建议在生产环境中使用。在 Java 9 中, Unsafe 类的访问权限更加受限, 因此更加不推荐在生产代码中使用它 在开发中, 应尽量使用 Java 提供的公开 API, 以确保代码的安全性和可维护性。如果确实需要执行一些高级和危险的操作, 应该仔细研究相关文档, 并且谨慎使用 Unsafe 类

# 示例

# 操作对象属性

直接修改属性值

使用 Java 的 Unsafe 类可以直接获取对象的偏移量, 然后通过偏移量来访问对象的成员变量。请注意, Unsafe 类是 Java 中的一个非公开类, 不建议在生产环境中使用它, 因为它可以绕过 Java 的安全检查, 可能导致不安全的操作

下面是一个使用 Unsafe 类获取对象的偏移量并访问成员变量的示例代码:

import sun.misc.Unsafe;
import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        // 获取Unsafe实例
        Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
        unsafeField.setAccessible(true);
        Unsafe unsafe = (Unsafe) unsafeField.get(null);

        // 创建一个对象
        MyClass myObject = new MyClass();
        System.out.println("Original value: " + myObject.getValue());

        // 获取成员变量在对象中的偏移量
        Field valueField = MyClass.class.getDeclaredField("value");
        long valueOffset = unsafe.objectFieldOffset(valueField);

        // 使用偏移量设置新的值
        unsafe.putInt(myObject, valueOffset, 42);

        System.out.println("New value: " + myObject.getValue());
    }
}

class MyClass {
    private int value;

    public int getValue() {
        return value;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

在这个示例中, 我们通过反射获取 Unsafe 类的实例, 然后获取 MyClass 对象的 value 成员变量在对象中的偏移量 valueOffset。接着, 我们使用偏移量 valueOffset 来直接修改 MyClass 对象的 value 成员变量的值。注意, 这里我们是直接修改对象内存的内容, 这是非常不安全的操作, 请谨慎使用

#Java
上次更新: 2026/10/18, 22:14:48
weakreference
collections

← weakreference collections→

最近更新
01
Codex 使用与会话管理指南
10-17
02
Tailscale 入门:让自己的设备跨网络互联
10-15
03
GitHub CLI(gh)工作流与 CI 排查
10-08
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式