亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

內聯類在 openJdk 上生成奇怪的名字

內聯類在 openJdk 上生成奇怪的名字

HUWWW 2021-12-22 19:01:31
Hej,我正在用 kotlin 構建一個 Spring Boot 應用程序,并想使用內聯類。我做了一個 spring 數據存儲庫,它有一個方法如下: fun getBy(name: GameName)其中 GameName 是一個內聯類 inline class GameName(val value: String)一切都在本地運行,我正在運行 jdk 1.8.0_181-b13。但是當我將它部署到谷歌云時,spring boot 應用程序沒有啟動。谷歌云似乎正在運行 openjdk 1.8.0_181。當我在本地反編譯代碼時,它看起來像這樣: public GameConfigurationEntity getBy_00UsoVY/* $FF was: getBy-00UsoVY*/(@NotNull String gameName, @NotNull UUID id) { ... }但是在谷歌云上我收到以下錯誤: Caused by: java.lang.ClassFormatError: Illegal method name "getByName-MZoZWhM"因此,它似乎在本地使用,_而在谷歌云上使用,-并且-在方法名稱中不是有效字符。其他人有這個嗎?完整的堆棧跟蹤: [INFO] GCLOUD: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gameConfigurationService' defined in URL [jar:file:/app.jar!/BOOT-INF/classes!/com/hexigames/configurationservice/domain/game/GameConfigurationService.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class com.hexigames.configurationservice.domain.game.GameConfigurationService: Common causes of this problem include using a final class or a non-visible class; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null[INFO] GCLOUD:  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:581) ~[spring-beans-5.0.10.RELEASE.jar!/:5.0.10.RELEASE][INFO] GCLOUD:  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) ~[spring-beans-5.0.10.RELEASE.jar!/:5.0.10.RELEASE][INFO] GCLOUD:  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.10.RELEASE.jar!/:5.0.10.RELEASE]
查看完整描述

2 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

關鍵點在堆棧跟蹤的底部:


org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:336) ~[spring-core-5.0.10.RELEASE.jar!/:5.0.10.RELEASE]

[INFO] GCLOUD:  ... 43 common frames omitted

[INFO] GCLOUD: Caused by: java.lang.ClassFormatError: Illegal method name "createConfiguration-tQynZQ0" in class com/hexigames/configurationservice/domain/game/GameConfigurationService$$EnhancerBySpringCGLIB$$76757398

[INFO] GCLOUD:  at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_181]

[INFO] GCLOUD:  at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_181]

換句話說,Spring 使用自定義類加載器按需生成類。此類使用帶有 - 的方法名稱。defineClass1類加載器中的方法會阻塞它。由于類加載器用于加載任何類,我唯一的假設是谷歌云以某種方式使用了調整后的類加載器。由于類加載器對安全性非常敏感,這是有道理的,但顯然您的 Kotlin 代碼對安全性不敏感。


根據 JVM 規范,該-字符不是 JVM 級別方法名稱中的非法字符:https : //docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.2。 2 . 因此,這似乎是谷歌云平臺中的一個錯誤。順便提一句。該字符在 Java 中是非法的,但 JVM 寬松得多。


查看完整回答
反對 回復 2021-12-22
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

發生這種情況是由于 kotlin 編譯器進行了名稱修改。接受內聯類的函數不能從 Java 調用。(官方文檔


查看完整回答
反對 回復 2021-12-22
  • 2 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號