{"id":15138534,"url":"https://github.com/dreamlike-ocean/unsafejava","last_synced_at":"2025-07-08T01:10:12.225Z","repository":{"id":165405554,"uuid":"623983587","full_name":"dreamlike-ocean/UnsafeJava","owner":"dreamlike-ocean","description":"提供无需添加额外启动参数就可以使用JDK带来的各种内部api的解决方案 兼jvmci探索","archived":false,"fork":false,"pushed_at":"2024-12-30T11:43:27.000Z","size":182,"stargazers_count":46,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-30T19:11:16.368Z","etag":null,"topics":["java","vertx","vertx-web","virtualthreads"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dreamlike-ocean.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-05T13:54:17.000Z","updated_at":"2025-01-23T00:10:42.000Z","dependencies_parsed_at":"2024-12-30T12:24:45.339Z","dependency_job_id":"9e8c20d3-5f8d-4d2a-bab2-0e69cc133f9d","html_url":"https://github.com/dreamlike-ocean/UnsafeJava","commit_stats":{"total_commits":34,"total_committers":2,"mean_commits":17.0,"dds":0.02941176470588236,"last_synced_commit":"959f939512af3e0def122513dfbb65c858e14970"},"previous_names":["dreamlike-ocean/unsafejava"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dreamlike-ocean%2FUnsafeJava","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dreamlike-ocean%2FUnsafeJava/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dreamlike-ocean%2FUnsafeJava/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dreamlike-ocean%2FUnsafeJava/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dreamlike-ocean","download_url":"https://codeload.github.com/dreamlike-ocean/UnsafeJava/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237843805,"owners_count":19375206,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","vertx","vertx-web","virtualthreads"],"created_at":"2024-09-26T07:40:47.958Z","updated_at":"2025-02-08T17:31:05.028Z","avatar_url":"https://github.com/dreamlike-ocean.png","language":"Java","readme":"本项目是提供一组在虚拟线程里面很有用但是被jdk屏蔽掉的API\n全部都以同名的函数/类型的形式提供\n包含以下功能\n- CarrierThreadLocal\n- 自定义调度器\n- Continuation API 包含yield和run原语\n- TerminatingThreadLocal API\n- 特权LookUp\n- java.lang.LiveStackFrameInfo获取当前栈信息，比如说Monitor信息，局部变量表及获取对应引用\n\n原理很简单\n代码如下\n```java\n    private static MethodHandles.Lookup fetchUnsafeHandler() {\n        Class\u003cMethodHandles.Lookup\u003e lookupClass = MethodHandles.Lookup.class;\n\n        try {\n            Field implLookupField = lookupClass.getDeclaredField(\"IMPL_LOOKUP\");\n            long offset = UNSAFE.staticFieldOffset(implLookupField);\n            return (MethodHandles.Lookup) UNSAFE.getObject(UNSAFE.staticFieldBase(implLookupField), offset);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n```\nIMPL_LOOKUP这个是无视各种权限的lookup，从它这里获取到的MethodHandle无视任何权限\n然后就可以好好玩拿到MethodHandle了\n\n为了应对未来的Unsafe中的某些内存操作被移除的问题，在[寒老板](https://github.com/IceSoulHanxi)的一次群聊中提到了几个java动态库导出的符号，我们逆向了这些符号以及正向参考了openjdk源码，[使用Panama API封装了大部分的JNI操作](https://github.com/dreamlike-ocean/backend_qingyou/blob/main/dreamlike%E7%9A%84%E7%A7%81%E8%B4%A7/afterUnsafe.md),使得可以绕开模块化之类的限制让我们继续可以hack标准库，继续能拿到IMPL_LOOKUP字段\n\n\u003e [!WARNING]\n\u003e 目前只在Linux以及Windows x86_64,Mac(aarch64以及amd64)上测试过，其他平台可能需要评估兼容性问题\n\n\nmaven 坐标为，本库以multi-release的形式发布，所以你可以在jdk8-jdk22上使用，从jdk22开始默认使用的Panama的实现\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.dreamlike-ocean\u003c/groupId\u003e\n  \u003cartifactId\u003eunsafe-core\u003c/artifactId\u003e\n  \u003cversion\u003e1.3\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n当然你也会发现项目里面有另外一种写法，即获取到MethodHandle之后转换为`java.util.function.Function`，这两种形式核心原理是一样的\n```java\n    private static Function\u003cExecutor, Thread.Builder.OfVirtual\u003e fetchVirtualThreadBuilder() {\n        var tmp = Thread.ofVirtual().getClass();\n        try {\n            MethodHandle builderMethodHandle = IMPL_LOOKUP\n                    .in(tmp)\n                    .findConstructor(tmp, MethodType.methodType(void.class, Executor.class));\n            MethodHandle lambdaFactory = LambdaMetafactory.metafactory(\n                    IMPL_LOOKUP,\n                    \"apply\",\n                    MethodType.methodType(Function.class),\n                    MethodType.methodType(Object.class, Object.class),\n                    builderMethodHandle,\n                    builderMethodHandle.type()\n            ).getTarget();\n            return (Function\u003cExecutor, Thread.Builder.OfVirtual\u003e) lambdaFactory.invoke();\n        } catch (Throwable e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n```\n类似于lambda和sam\n\n\nTerminatingThreadLocal API的则是比较复杂\n这里用了内部的`jdk.internal.access.JavaLangAccess`的这个玩意强制打开限制，让我可以以继承的方式自定义它的销毁函数\n这里使用bytebuddy继承然后转发到field上面 具体看代码吧。。。\n\n对于给Vert.x的扩展，用的是Async/Await这种风格的，避免某些半瓶水再来烦我，我讲一下为什么要这样写\n首先我写的await函数只是强制要求当前在Continuation中而已，没有传染性的\n其次写`AsyncScope`只是帮你开启Continuation罢了\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdreamlike-ocean%2Funsafejava","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdreamlike-ocean%2Funsafejava","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdreamlike-ocean%2Funsafejava/lists"}