Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • shell

  • tool

  • 网络

  • algo

  • compute_base

  • blog

  • growth

  • java

    • java base
    • Java 面试高频问题指南
    • other

    • throwable
    • thread
    • jvm
    • weakreference
    • UnSafe
      • UnSafe
      • 示例
        • 操作对象属性
    • collections
    • Class
    • classloader
  • C&C++

  • ai

  • secure

  • cms

  • english

  • 生活

  • 金融学

  • more

  • other
  • 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#unsafe
上次更新: 2025/10/09, 23:53:03
weakreference
collections

← weakreference collections→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式