使用Kotlin的khttp调用HTTPS接口时遇InaccessibleObjectException求解决
解决khttp调用HTTPS时的InaccessibleObjectException异常
问题原因
khttp 1.4.2版本依赖的OkHttp版本较旧,且内部通过反射访问JDK或OkHttp的内部API,而JDK 9及以上版本引入的模块系统默认限制了这类反射操作,最终导致调用HTTPS接口时抛出权限异常。
可行解决办法
降级JDK版本至JDK 8
JDK 8没有模块权限限制,直接切换到JDK 8运行项目即可解决问题。在IDEA中可通过File → Project Structure → Project Settings → Project路径修改SDK版本为JDK 8。添加JVM启动参数开放反射权限
针对JDK 9+版本,在IDEA的运行配置中添加以下JVM参数,解除反射访问限制:--add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens okhttp3/internal/-=ALL-UNNAMED添加位置:
Run → Edit Configurations → 选中目标运行配置 → VM options中粘贴上述参数。替换为维护活跃的HTTP客户端库
khttp项目已长时间未更新(最后版本更新于2020年),长期使用建议替换为更稳定的库,示例如下:- OkHttp:直接使用官方库,示例代码:
依赖配置:import okhttp3.OkHttpClient import okhttp3.Request fun main() { val client = OkHttpClient() val request = Request.Builder().url("https://ifconfig.me/all").build() client.newCall(request).execute().use { response -> println(response.body?.string()) } }dependencies { implementation("com.squareup.okhttp3:okhttp:4.12.0") testImplementation(kotlin("test")) } - Ktor Client:Kotlin官方推荐的HTTP客户端,支持异步特性,示例代码:
依赖配置:import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.engine.okhttp.* import io.ktor.client.request.* suspend fun main() { val client = HttpClient(OkHttp) val response = client.get("https://ifconfig.me/all").body<String>() println(response) }dependencies { implementation("io.ktor:ktor-client-core:2.3.10") implementation("io.ktor:ktor-client-okhttp:2.3.10") testImplementation(kotlin("test")) }
- OkHttp:直接使用官方库,示例代码:
内容的提问来源于stack exchange,提问作者ArekBulski
相关产品推荐
相关产品推荐

