Files
KavaRef/zh-cn/config/migration.html
github-actions[bot] 29b7fb4ab9 Deploy to GitHub pages
2025-08-02 18:18:10 +00:00

100 lines
52 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="VuePress 2.0.0-rc.0">
<style>
:root {
--c-bg: #fff;
}
html.dark {
--c-bg: #22272e;
}
html, body {
background-color: var(--c-bg);
}
</style>
<script>
const userMode = localStorage.getItem('vuepress-color-scheme');
const systemDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
if (userMode === 'dark' || (userMode !== 'light' && systemDarkMode)) {
document.documentElement.classList.toggle('dark', true);
}
</script>
<link rel="icon" href="/KavaRef/images/logo.svg"><title>迁移至 KavaRef | KavaRef</title><meta name="description" content="一个使用 Kotlin 实现的现代化 Java 反射">
<link rel="preload" href="/KavaRef/assets/style-_yWeWZ9-.css" as="style"><link rel="stylesheet" href="/KavaRef/assets/style-_yWeWZ9-.css">
<link rel="modulepreload" href="/KavaRef/assets/app-mh6GuRj9.js"><link rel="modulepreload" href="/KavaRef/assets/migration.html-c2_NChU1.js"><link rel="modulepreload" href="/KavaRef/assets/migration.html-GY17HjTz.js">
<link rel="prefetch" href="/KavaRef/assets/index.html-Ov_ij_gv.js" as="script"><link rel="prefetch" href="/KavaRef/assets/index.html-CFZQ5XVF.js" as="script"><link rel="prefetch" href="/KavaRef/assets/index.html-W7aZ6bnM.js" as="script"><link rel="prefetch" href="/KavaRef/assets/migration.html-MsUQmaeZ.js" as="script"><link rel="prefetch" href="/KavaRef/assets/processor-resolvers.html-YYDSqVfs.js" as="script"><link rel="prefetch" href="/KavaRef/assets/r8-proguard.html-oPUAmrol.js" as="script"><link rel="prefetch" href="/KavaRef/assets/about.html-9T1xc62o.js" as="script"><link rel="prefetch" href="/KavaRef/assets/changelog.html-tvXK8X7C.js" as="script"><link rel="prefetch" href="/KavaRef/assets/contacts.html-L9oNW9KK.js" as="script"><link rel="prefetch" href="/KavaRef/assets/future.html-8f4lJIja.js" as="script"><link rel="prefetch" href="/KavaRef/assets/home.html-nmYQl1IQ.js" as="script"><link rel="prefetch" href="/KavaRef/assets/quick-start.html-Qcmp4XDc.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-core.html-Dt130sIh.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-extension.html-T1UdfLZL.js" as="script"><link rel="prefetch" href="/KavaRef/assets/about.html-wsvWpCuP.js" as="script"><link rel="prefetch" href="/KavaRef/assets/changelog.html-rnn3UCr6.js" as="script"><link rel="prefetch" href="/KavaRef/assets/contacts.html-yC5Cjm9f.js" as="script"><link rel="prefetch" href="/KavaRef/assets/future.html-TYRCoFGP.js" as="script"><link rel="prefetch" href="/KavaRef/assets/processor-resolvers.html-LDkOJBjK.js" as="script"><link rel="prefetch" href="/KavaRef/assets/r8-proguard.html-OS5OKrdo.js" as="script"><link rel="prefetch" href="/KavaRef/assets/home.html-6hAcbiCY.js" as="script"><link rel="prefetch" href="/KavaRef/assets/quick-start.html-XeqtvFBe.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-core.html-Ffv_VDo5.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-extension.html-fHAqKHa2.js" as="script"><link rel="prefetch" href="/KavaRef/assets/404.html-6Yl8cQE3.js" as="script"><link rel="prefetch" href="/KavaRef/assets/index.html-NhRLIkuI.js" as="script"><link rel="prefetch" href="/KavaRef/assets/index.html-8K8ZL9xM.js" as="script"><link rel="prefetch" href="/KavaRef/assets/index.html-5KLsgsb9.js" as="script"><link rel="prefetch" href="/KavaRef/assets/migration.html-Ye0WsuNZ.js" as="script"><link rel="prefetch" href="/KavaRef/assets/processor-resolvers.html-27WP0yfV.js" as="script"><link rel="prefetch" href="/KavaRef/assets/r8-proguard.html-dK3W_u38.js" as="script"><link rel="prefetch" href="/KavaRef/assets/about.html-GB22dzJZ.js" as="script"><link rel="prefetch" href="/KavaRef/assets/changelog.html-6g49VohJ.js" as="script"><link rel="prefetch" href="/KavaRef/assets/contacts.html-8ISTVPQY.js" as="script"><link rel="prefetch" href="/KavaRef/assets/future.html-3Px710os.js" as="script"><link rel="prefetch" href="/KavaRef/assets/home.html-Z0EW9e5o.js" as="script"><link rel="prefetch" href="/KavaRef/assets/quick-start.html-q_jDDuWq.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-core.html-tTFO-8Za.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-extension.html-IUNV997z.js" as="script"><link rel="prefetch" href="/KavaRef/assets/about.html-yDUNfYYH.js" as="script"><link rel="prefetch" href="/KavaRef/assets/changelog.html-vN7TJtDC.js" as="script"><link rel="prefetch" href="/KavaRef/assets/contacts.html-YmutBtVn.js" as="script"><link rel="prefetch" href="/KavaRef/assets/future.html-aZj72rRC.js" as="script"><link rel="prefetch" href="/KavaRef/assets/processor-resolvers.html-9c-bJv94.js" as="script"><link rel="prefetch" href="/KavaRef/assets/r8-proguard.html-dGWuVyvG.js" as="script"><link rel="prefetch" href="/KavaRef/assets/home.html-ZBkLyAmP.js" as="script"><link rel="prefetch" href="/KavaRef/assets/quick-start.html-URixYC24.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-core.html-4qPYzqqN.js" as="script"><link rel="prefetch" href="/KavaRef/assets/kavaref-extension.html-Is97lgJ-.js" as="script"><link rel="prefetch" href="/KavaRef/assets/404.html-QklWHkM6.js" as="script">
</head>
<body>
<div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/KavaRef/zh-cn/" class=""><img class="logo" src="/KavaRef/images/logo.svg" alt="KavaRef"><span class="site-name can-hide">KavaRef</span></a></span><div class="navbar-items-wrapper" style=""><!--[--><!--]--><nav class="navbar-items can-hide"><!--[--><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="导航"><span class="title">导航</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="导航"><span class="title">导航</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>入门</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/guide/home.html" class="" aria-label="介绍"><!--[--><!--]--> 介绍 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/guide/quick-start.html" class="" aria-label="快速开始"><!--[--><!--]--> 快速开始 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>依赖</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/library/kavaref-core.html" class="" aria-label="kavaref-core"><!--[--><!--]--> kavaref-core <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/library/kavaref-extension.html" class="" aria-label="kavaref-extension"><!--[--><!--]--> kavaref-extension <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>配置</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/config/r8-proguard.html" class="" aria-label="R8 与 Proguard 混淆"><!--[--><!--]--> R8 与 Proguard 混淆 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/config/processor-resolvers.html" class="" aria-label="第三方 Member 解析器"><!--[--><!--]--> 第三方 Member 解析器 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html" class="router-link-active router-link-exact-active router-link-active" aria-label="迁移至 KavaRef"><!--[--><!--]--> 迁移至 KavaRef <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>关于</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/changelog.html" class="" aria-label="更新日志"><!--[--><!--]--> 更新日志 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/future.html" class="" aria-label="展望未来"><!--[--><!--]--> 展望未来 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/contacts.html" class="" aria-label="联系我们"><!--[--><!--]--> 联系我们 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/about.html" class="" aria-label="关于此文档"><!--[--><!--]--> 关于此文档 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul></div></div><div class="navbar-item"><a href="/KavaRef/zh-cn/about/contacts" class="" aria-label="联系我们"><!--[--><!--]--> 联系我们 <!--[--><!--]--></a></div><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">简体中文 (CN)</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">简体中文 (CN)</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><a href="/KavaRef/en/config/migration.html" class="" aria-label="English"><!--[--><!--]--> English <!--[--><!--]--></a></li><li class="navbar-dropdown-item"><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html" class="router-link-active router-link-exact-active router-link-active" aria-label="简体中文"><!--[--><!--]--> 简体中文 <!--[--><!--]--></a></li><!--]--></ul></div></div><div class="navbar-item"><a class="external-link" href="https://github.com/HighCapable/KavaRef" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口中打开</span></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button class="toggle-color-mode-button" title="切换颜色模式"><svg style="" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg style="display:none;" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" placeholder="搜索" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="sidebar-mask"></div><!--[--><aside class="sidebar"><nav class="navbar-items"><!--[--><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="导航"><span class="title">导航</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="导航"><span class="title">导航</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>入门</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/guide/home.html" class="" aria-label="介绍"><!--[--><!--]--> 介绍 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/guide/quick-start.html" class="" aria-label="快速开始"><!--[--><!--]--> 快速开始 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>依赖</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/library/kavaref-core.html" class="" aria-label="kavaref-core"><!--[--><!--]--> kavaref-core <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/library/kavaref-extension.html" class="" aria-label="kavaref-extension"><!--[--><!--]--> kavaref-extension <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>配置</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/config/r8-proguard.html" class="" aria-label="R8 与 Proguard 混淆"><!--[--><!--]--> R8 与 Proguard 混淆 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/config/processor-resolvers.html" class="" aria-label="第三方 Member 解析器"><!--[--><!--]--> 第三方 Member 解析器 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html" class="router-link-active router-link-exact-active router-link-active" aria-label="迁移至 KavaRef"><!--[--><!--]--> 迁移至 KavaRef <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>关于</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/changelog.html" class="" aria-label="更新日志"><!--[--><!--]--> 更新日志 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/future.html" class="" aria-label="展望未来"><!--[--><!--]--> 展望未来 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/contacts.html" class="" aria-label="联系我们"><!--[--><!--]--> 联系我们 <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/KavaRef/zh-cn/about/about.html" class="" aria-label="关于此文档"><!--[--><!--]--> 关于此文档 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul></div></div><div class="navbar-item"><a href="/KavaRef/zh-cn/about/contacts" class="" aria-label="联系我们"><!--[--><!--]--> 联系我们 <!--[--><!--]--></a></div><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">简体中文 (CN)</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">简体中文 (CN)</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><a href="/KavaRef/en/config/migration.html" class="" aria-label="English"><!--[--><!--]--> English <!--[--><!--]--></a></li><li class="navbar-dropdown-item"><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html" class="router-link-active router-link-exact-active router-link-active" aria-label="简体中文"><!--[--><!--]--> 简体中文 <!--[--><!--]--></a></li><!--]--></ul></div></div><div class="navbar-item"><a class="external-link" href="https://github.com/HighCapable/KavaRef" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口中打开</span></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="sidebar-items"><!--[--><li><p tabindex="0" class="sidebar-item sidebar-heading collapsible">入门 <span class="right arrow"></span></p><ul style="display:none;" class="sidebar-item-children"><!--[--><li><a href="/KavaRef/zh-cn/guide/home.html" class="sidebar-item" aria-label="介绍"><!--[--><!--]--> 介绍 <!--[--><!--]--></a><!----></li><li><a href="/KavaRef/zh-cn/guide/quick-start.html" class="sidebar-item" aria-label="快速开始"><!--[--><!--]--> 快速开始 <!--[--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="sidebar-item sidebar-heading collapsible">依赖 <span class="right arrow"></span></p><ul style="display:none;" class="sidebar-item-children"><!--[--><li><a href="/KavaRef/zh-cn/library/kavaref-core.html" class="sidebar-item" aria-label="kavaref-core"><!--[--><!--]--> kavaref-core <!--[--><!--]--></a><!----></li><li><a href="/KavaRef/zh-cn/library/kavaref-extension.html" class="sidebar-item" aria-label="kavaref-extension"><!--[--><!--]--> kavaref-extension <!--[--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="sidebar-item sidebar-heading active collapsible">配置 <span class="down arrow"></span></p><ul style="" class="sidebar-item-children"><!--[--><li><a href="/KavaRef/zh-cn/config/r8-proguard.html" class="sidebar-item" aria-label="R8 与 Proguard 混淆"><!--[--><!--]--> R8 与 Proguard 混淆 <!--[--><!--]--></a><!----></li><li><a href="/KavaRef/zh-cn/config/processor-resolvers.html" class="sidebar-item" aria-label="第三方 Member 解析器"><!--[--><!--]--> 第三方 Member 解析器 <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html" class="router-link-active router-link-exact-active router-link-active sidebar-item active" aria-label="迁移至 KavaRef"><!--[--><!--]--> 迁移至 KavaRef <!--[--><!--]--></a><ul style="" class="sidebar-item-children"><!--[--><li><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html#基本功能" class="router-link-active router-link-exact-active sidebar-item" aria-label="基本功能"><!--[--><!--]--> 基本功能 <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html#其它功能" class="router-link-active router-link-exact-active sidebar-item" aria-label="其它功能"><!--[--><!--]--> 其它功能 <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html#异常处理" class="router-link-active router-link-exact-active sidebar-item" aria-label="异常处理"><!--[--><!--]--> 异常处理 <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/KavaRef/zh-cn/config/migration.html#初次使用-kavaref" class="router-link-active router-link-exact-active sidebar-item" aria-label="初次使用 KavaRef"><!--[--><!--]--> 初次使用 KavaRef <!--[--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><li><p tabindex="0" class="sidebar-item sidebar-heading collapsible">关于 <span class="right arrow"></span></p><ul style="display:none;" class="sidebar-item-children"><!--[--><li><a href="/KavaRef/zh-cn/about/changelog.html" class="sidebar-item" aria-label="更新日志"><!--[--><!--]--> 更新日志 <!--[--><!--]--></a><!----></li><li><a href="/KavaRef/zh-cn/about/future.html" class="sidebar-item" aria-label="展望未来"><!--[--><!--]--> 展望未来 <!--[--><!--]--></a><!----></li><li><a href="/KavaRef/zh-cn/about/contacts.html" class="sidebar-item" aria-label="联系我们"><!--[--><!--]--> 联系我们 <!--[--><!--]--></a><!----></li><li><a href="/KavaRef/zh-cn/about/about.html" class="sidebar-item" aria-label="关于此文档"><!--[--><!--]--> 关于此文档 <!--[--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="page"><!--[--><!--]--><div class="theme-default-content"><!--[--><!--]--><div><h1 id="迁移至-kavaref" tabindex="-1"><a class="header-anchor" href="#迁移至-kavaref" aria-hidden="true">#</a> 迁移至 KavaRef</h1><p>如果你已经习惯使用 <a href="https://github.com/HighCapable/YukiReflection" target="_blank" rel="noopener noreferrer">YukiReflection<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口中打开</span></span></a><a href="https://github.com/HighCapable/YukiHookAPI" target="_blank" rel="noopener noreferrer">YukiHookAPI<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口中打开</span></span></a> 中的反射 API你可以参考以下内容来迁移至 <code>KavaRef</code></p><div class="custom-container warning"><p class="custom-container-title">注意</p><p>针对 <code>YukiHookAPI</code>,你需要继续使用其 Hook API<code>KavaRef</code> 仅包含 Java 反射相关 API。</p></div><h2 id="基本功能" tabindex="-1"><a class="header-anchor" href="#基本功能" aria-hidden="true">#</a> 基本功能</h2><p><code>KavaRef</code> 的设计理念与 <code>YukiReflection</code> 类似,但不完全相同,以下内容列举了 <code>YukiReflection</code><code>KavaRef</code> 在基本反射功能上的差异,你可以根据这些差异手动进行迁移。</p><p>例如我们有以下 Java 类。</p><blockquote><p>示例如下</p></blockquote><div class="language-java" data-ext="java"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">public</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MyClass</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">private</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">static</span><span style="color:#ADBAC7;"> String</span><span style="color:#F69D50;"> </span><span style="color:#ADBAC7;">content</span><span style="color:#F69D50;"> </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;Hello, World!&quot;</span><span style="color:#ADBAC7;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">private</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">void</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">myMethod</span><span style="color:#ADBAC7;">(String </span><span style="color:#F69D50;">content</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> System.out.</span><span style="color:#DCBDFB;">println</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello &quot;</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">+</span><span style="color:#ADBAC7;"> content </span><span style="color:#F47067;">+</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;!&quot;</span><span style="color:#ADBAC7;">);</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span></code></pre></div><p>以下是 <code>KavaRef</code><code>YukiReflection</code> 的使用示例对比。</p><blockquote><p>示例如下</p></blockquote><div style="display:flex;gap:16px;"><div style="flex:1;"><h4>KavaRef</h4><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 MyClass 实例</span></span>
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> myClass: </span><span style="color:#F69D50;">MyClass</span></span>
<span class="line"><span style="color:#768390;">// 使用 KavaRef 调用并执行</span></span>
<span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">resolve</span><span style="color:#ADBAC7;">().</span><span style="color:#DCBDFB;">firstMethod</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;myMethod&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">parameters</span><span style="color:#ADBAC7;">(String::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#ADBAC7;">}.</span><span style="color:#DCBDFB;">of</span><span style="color:#ADBAC7;">(myClass).</span><span style="color:#DCBDFB;">invoke</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello, KavaRef!&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#768390;">// 直接引用实例方式</span></span>
<span class="line"><span style="color:#ADBAC7;">myClass.</span><span style="color:#DCBDFB;">asResolver</span><span style="color:#ADBAC7;">().</span><span style="color:#DCBDFB;">firstMethod</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;myMethod&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">parameters</span><span style="color:#ADBAC7;">(String::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#ADBAC7;">}.</span><span style="color:#DCBDFB;">invoke</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello, KavaRef!&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div><div style="flex:1;"><h4>YukiReflection</h4><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 MyClass 实例</span></span>
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> myClass: </span><span style="color:#F69D50;">MyClass</span></span>
<span class="line"><span style="color:#768390;">// 使用 YukiReflection 调用并执行</span></span>
<span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.java.</span><span style="color:#DCBDFB;">method</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;myMethod&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">param</span><span style="color:#ADBAC7;">(StringClass)</span></span>
<span class="line"><span style="color:#ADBAC7;">}.</span><span style="color:#DCBDFB;">get</span><span style="color:#ADBAC7;">(myClass).</span><span style="color:#DCBDFB;">call</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello, YukiReflection!&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#768390;">// 直接引用实例方式</span></span>
<span class="line"><span style="color:#ADBAC7;">myClass.</span><span style="color:#DCBDFB;">current</span><span style="color:#ADBAC7;">().</span><span style="color:#DCBDFB;">method</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;myMethod&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">param</span><span style="color:#ADBAC7;">(StringClass)</span></span>
<span class="line"><span style="color:#ADBAC7;">}.</span><span style="color:#DCBDFB;">call</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello, YukiReflection!&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></div><p><code>KavaRef</code> 在任何时候开始反射都需要使用 <code>resolve()</code> 来创建反射作用域,不再对 <code>Class</code> 等实例直接进行扩展相关 <code>method</code><code>constructor</code> 方法以避免污染其作用域。</p><p><code>KavaRef</code> 提供了 <code>asResolver()</code> 方法来直接引用实例对象的反射作用域,避免了 <code>YukiReflection</code> 中的 <code>current()</code> 方法创建不可控实例对象造成的污染。</p><p><code>KavaRef</code> 抛弃了 &quot;Finder&quot; 的设计理念,使用 &quot;Filter&quot; (过滤器) 的设计理念来获取反射结果,“查找” 不再是查找,而是 “过滤”。</p><p><code>KavaRef</code> 取消了 <code>YukiReflection</code> 在结果实例中定义获取的 <code>Member</code> 为多重还是单一的设计方案,直接返回整个 <code>List&lt;MemberResolver&gt;</code> 你在上方看到的示例使用了 <code>firstMethod</code> 来获取第一个匹配的 <code>MethodResolver</code>,如果你需要获取所有匹配的结果,可以改为 <code>method</code></p><p><code>KavaRef</code><code>MethodCondition</code> 中的条件方法名称已由 <code>YukiReflection</code> 之前的 <code>param</code> 等简写修改为 <code>parameters</code>,以更符合 Java 反射 API 的命名习惯。</p><p><code>KavaRef</code> 不再提供条件中的 <code>param(...).order()</code> 功能,因为这个功能本身就不稳定,<code>KavaRef</code> 现在使用迭代器进行过滤操作,字节码将不再有顺序,且本不应该使用顺序筛选字节码,你可以使用 <code>firstMethod</code><code>firstField</code><code>lastMethod</code><code>lastField</code> 等方法来获取第一个或最后一个匹配的结果。</p><p><code>KavaRef</code><code>get(instance)</code> 方法更名为 <code>of(instance)</code>,因为 <code>get(...)</code> 可能会与 <code>Field</code><code>get(...)</code> 用法产生混淆且语义不明确, 同时 <code>get(instance)</code> 也不再是从类似 <code>MethodFinder.Result</code> 来获取 <code>MethodFinder.Result.Instance</code> 实例,而是使用 <code>of(instance)</code> 来始终操作和设置实例对象到 <code>MemberResolver</code></p><p>类似 <code>MethodFinder.Result.Instance</code> 中的 <code>string()</code><code>int()</code> 等方法在 <code>KavaRef</code> 中已被移除, 你可以直接使用 <code>get&lt;String&gt;()</code><code>get&lt;Int&gt;()</code><code>invoke&lt;String&gt;(...)</code><code>invoke&lt;Int&gt;(...)</code> 等方式来获取或调用对应类型的结果。</p><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>如果你正在查找 (过滤) <code>Field</code>,你需要注意 <code>KavaRef</code><code>YukiReflection</code><code>Field</code> 的获取方式上有可能会发生语义冲突,在迁移这部分的时候请特别注意。</p><p>例如获取 <code>MyClass</code> 中的 <code>content</code> 静态字段,在 <code>YukiReflection</code> 中,你会这样做。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.java</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">field</span><span style="color:#ADBAC7;"> { name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;content&quot;</span><span style="color:#ADBAC7;"> } </span><span style="color:#768390;">// 返回 FieldFinder.Result</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">get</span><span style="color:#ADBAC7;">() </span><span style="color:#768390;">// 不可省略,返回 FieldFinder.Result.Instance</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">string</span><span style="color:#ADBAC7;">() </span><span style="color:#768390;">// 值</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>KavaRef</code> 中,你需要这样做。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">resolve</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">firstField</span><span style="color:#ADBAC7;"> { name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;content&quot;</span><span style="color:#ADBAC7;"> } </span><span style="color:#768390;">// 返回 FieldResolver&lt;MyClass&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">get</span><span style="color:#ADBAC7;">&lt;</span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">&gt;() </span><span style="color:#768390;">// 值</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>正如上面所说,<code>get(...)</code><code>YukiReflection</code> 中是获取 <code>FieldFinder.Result.Instance</code> 对象,而不是值,要获取值并处理为指定类型,你需要调用 <code>string()</code> 或者 <code>cast&lt;String&gt;()</code>,而在 <code>KavaRef</code> 中是在 <code>MemberResolver</code> 中直接使用 <code>get&lt;T&gt;()</code> 来获取指定类型的值,<code>KavaRef</code> 对应 <code>YukiReflection</code><code>get(...)</code> 的用法是 <code>of(...)</code></p><p>所以上述示例在 <code>KavaRef</code> 中的完整写法应该为。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 由于调用的是静态实例,&quot;of(null)&quot; 可被省略</span></span>
<span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">resolve</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">firstField</span><span style="color:#ADBAC7;"> { name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;content&quot;</span><span style="color:#ADBAC7;"> } </span><span style="color:#768390;">// 已是调用链对象 FieldResolver&lt;MyClass&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">of</span><span style="color:#ADBAC7;">(</span><span style="color:#6CB6FF;">null</span><span style="color:#ADBAC7;">) </span><span style="color:#768390;">// 可省略,返回调用链对象 FieldResolver&lt;MyClass&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">get</span><span style="color:#ADBAC7;">&lt;</span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">&gt;() </span><span style="color:#768390;">// 值</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div><p><code>KavaRef</code> 不再对 <code>Method</code> 提供 <code>call</code> 方法,现在统一合并为 <code>invoke</code> (带泛型参数),同时 <code>KavaRef</code><code>Constructor</code><code>newInstance</code> 方法定义为 <code>create</code> (带泛型参数)。</p><p>你可能注意到条件 <code>superClass()</code> 消失了,它还在,在 <code>KavaRef</code> 中它已更名为 <code>superclass()</code>,对接标准的 Java 反射 API。</p><p>同时,<code>KavaRef</code><code>KClass</code> 进行了扩展,你不再需要在大部分场景中使用 <code>Some::class.java</code> 的方式来声明一个 <code>Class</code> 实例。</p><p><code>KavaRef</code> 的另一个设计思想就是类型安全,只要是你在使用声明指定泛型类型的 <code>KClass&lt;T&gt;</code><code>Class&lt;T&gt;</code> 时,在 <code>of(instance)</code><code>create(...)</code> 时都会校验、转换为对应类型,在编码期间就完成类型检查,避免运行时错误。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 MyClass 实例</span></span>
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> myClass: </span><span style="color:#F69D50;">MyClass</span></span>
<span class="line"><span style="color:#768390;">// 使用 KavaRef 调用并执行</span></span>
<span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">resolve</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">firstMethod</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;myMethod&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">parameters</span><span style="color:#ADBAC7;">(String::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 只能传入 MyClass 类型的实例</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">of</span><span style="color:#ADBAC7;">(myClass)</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">invoke</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello, KavaRef!&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="其它功能" tabindex="-1"><a class="header-anchor" href="#其它功能" aria-hidden="true">#</a> 其它功能</h2><p><code>KavaRef</code><code>YukiReflection</code> 在其它功能及扩展功能中的实现差异不大,<code>KavaRef</code> 将这些功能单独分离为了一个独立的模块。</p><p>以下功能在 <code>YukiReflection</code> 中提供,但在 <code>KavaRef</code> 中没有实现且不再提供:</p><ul><li><p>预置反射类型常量类,如 <code>StringClass</code><code>IntType</code></p><ul><li>你可以直接使用 <code>String::class</code><code>Int::class</code> 等 Kotlin 的类引用进行替代,对于原始类型与包装类,<code>IntType</code> 等价于 <code>Int::class</code><code>IntClass</code> 等价于 <code>JInteger::class</code></li></ul></li><li><p><code>DexClassFinder</code> 功能</p><ul><li>由于其设计缺陷,且在 Android 平台上使用时可能存在性能问题,目前不再提供</li></ul></li><li><p><code>RemedyPlan</code><code>method { ... } .remedys { ... }</code> 功能</p><ul><li>由于此功能存在可能的黑盒问题,维护相对困难,如需使用类似功能,请手动实现,不再提供</li></ul></li><li><p><code>ClassLoader.listOfClasses()</code> 功能</p><ul><li>由于各个平台实现方案复杂且不稳定,不再提供</li></ul></li><li><p><code>ClassLoader.searchClass()</code> 功能</p><ul><li>由于性能问题,且设计时仅限于 Android 平台使用,过滤条件维护相对困难,不再提供</li></ul></li><li><p><code>Class.hasExtends</code><code>Class.extends</code><code>Class.implements</code> 功能</p><ul><li>你可以使用 <code>A::class isSubclassOf B::class</code> 来取代它们</li></ul></li><li><p><code>Class.toJavaPrimitiveType()</code> 功能</p><ul><li>功能设计上存在概念混淆问题,不再提供</li></ul></li><li><p><code>&quot;com.some.clazz&quot;.hasClass(loader)</code> 功能</p><ul><li>你可以使用 <code>loader.hasClass(&quot;com.some.clazz&quot;)</code> 来取代它</li></ul></li><li><p><code>Class.hasField</code><code>Class.hasMethod</code><code>Class.hasConstructor</code> 功能</p><ul><li>由于设计缺陷,不再提供</li></ul></li><li><p><code>Class.hasModifiers(...)</code><code>Member.hasModifiers(...)</code> 功能</p><ul><li>你可以直接使用 <code>Class.isPublic</code><code>Member.isPublic</code> 等扩展方法来取代它们。</li></ul></li><li><p><code>Class.generic()</code><code>GenericClass</code> 功能</p><ul><li>如果只是希望获取超类的泛型参数,你可以使用 <code>Class.genericSuperclassTypeArguments()</code>,由于设计缺陷,不再提供</li></ul></li><li><p><code>Any.current()</code><code>CurrentClass</code> 功能</p><ul><li>你可以使用 <code>Any.asResolver()</code> 来取代它</li></ul></li><li><p><code>Class.buildOf(...)</code> 功能</p><ul><li>你可以使用 <code>Class.createInstance(...)</code> 来取代它</li></ul></li><li><p><code>Class.allMethods()</code><code>Class.allFields()</code><code>Class.allConstructors()</code> 功能</p><ul><li>由于其污染作用域,不再提供</li></ul></li><li><p><code>YLog</code> 日志功能</p><ul><li><code>KavaRef</code> 不再接管日志,你可以使用对应平台的实现方式,不再提供</li></ul></li></ul><h2 id="异常处理" tabindex="-1"><a class="header-anchor" href="#异常处理" aria-hidden="true">#</a> 异常处理</h2><p><code>KavaRef</code> 在异常处理方面与 <code>YukiReflection</code> 完全不同,<code>KavaRef</code> 的异常逻辑将保持默认透明,<u><strong>它不再主动拦截异常并打印错误日志甚至是提供 <code>onNoSuchMethod</code> 监听</strong></u>,当没有过滤到任何有效的成员时,<code>KavaRef</code> 会直接抛出异常,除非你<strong>明确声明条件为可选 (与 <code>YukiReflection</code> 逻辑保持一致)</strong></p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 假设这就是你的 MyClass 实例</span></span>
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> myClass: </span><span style="color:#F69D50;">MyClass</span></span>
<span class="line"><span style="color:#768390;">// 使用 KavaRef 调用并执行</span></span>
<span class="line"><span style="color:#ADBAC7;">MyClass::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">resolve</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">optional</span><span style="color:#ADBAC7;">() </span><span style="color:#768390;">// 声明为可选,不要抛出异常</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 使用 firstMethodOrNull 替代 firstMethod因为找不到会抛出 Kotlin 自身的 NoSuchElementException</span></span>
<span class="line"><span style="color:#ADBAC7;"> .</span><span style="color:#DCBDFB;">firstMethodOrNull</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;doNonExistentMethod&quot;</span><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 假设这个方法不存在</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">parameters</span><span style="color:#ADBAC7;">(String::</span><span style="color:#DCBDFB;">class</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#ADBAC7;"> }?.</span><span style="color:#DCBDFB;">of</span><span style="color:#ADBAC7;">(myClass)?.</span><span style="color:#DCBDFB;">invoke</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;Hello, KavaRef!&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>更多内容请参考 <a href="/KavaRef/zh-cn/library/kavaref-core.html" class="">kavaref-core</a> 中的 <a href="/KavaRef/zh-cn/library/kavaref-core.html#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86" class="">异常处理</a> 部分。</p><h2 id="初次使用-kavaref" tabindex="-1"><a class="header-anchor" href="#初次使用-kavaref" aria-hidden="true">#</a> 初次使用 KavaRef</h2><p>如果你没用过 <code>YukiReflection</code> 或者 <code>YukiHookAPI</code>,没关系,你可以参考以下内容来快速上手。</p><div class="custom-container tip"><p class="custom-container-title">接下来做什么</p><p>更多内容,请继续阅读 <a href="/KavaRef/zh-cn/library/kavaref-core.html" class="">kavaref-core</a><a href="/KavaRef/zh-cn/library/kavaref-extension.html" class="">kavaref-extension</a></p><p>立即开始使用 <code>KavaRef</code> 吧!</p></div></div><!--[--><!--]--></div><footer class="page-meta"><div class="meta-item edit-link"><a class="external-link meta-item-label" href="https://github.com/HighCapable/KavaRef/edit/main/docs-source/src/zh-cn/config/migration.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页"><!--[--><!--]--> 在 GitHub 上编辑此页 <span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口中打开</span></span><!--[--><!--]--></a></div><div class="meta-item last-updated"><span class="meta-item-label">上次更新: </span><!----></div><div class="meta-item contributors"><span class="meta-item-label">贡献者: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: qzmmcn@163.com">fankesyooni</span><!----><!--]--><!--]--></span></div></footer><nav class="page-nav"><p class="inner"><span class="prev"><a href="/KavaRef/zh-cn/config/processor-resolvers.html" class="" aria-label="第三方 Member 解析器"><!--[--><!--]--> 第三方 Member 解析器 <!--[--><!--]--></a></span><!----></p></nav><!--[--><!--]--></main><!--]--></div><!----><!--]--></div>
<script type="module" src="/KavaRef/assets/app-mh6GuRj9.js" defer></script>
</body>
</html>