V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heavyrainn
V2EX  ›  程序员

请问, kotlin 中与 Java 的 class 名::属性等价的操作是什么呢?

  •  
  •   heavyrainn · 2021-09-07 15:26:44 +08:00 · 1682 次点击
    这是一个创建于 1184 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟在学习使用 beetlsql,当使用 lambdaQuery 的时候会发生报错,代码如下:

    val sqlManager = getSQLManager()
    //初始化数据脚本,执行后,内存数据库将有一个 sys_user 表和模拟数据
    DBInitHelper.executeSqlScript(sqlManager, "db/schema.sql")
    
    
    val query = sqlManager.lambdaQuery(UserEntity::class.java)
    val entities = query.andEq(UserEntity::departmentId, 1)
    .andIsNotNull(UserEntity::name).select()
    /*上述代码对应的 java 代码如下:
    LambdaQuery<UserEntity> query = sqlManager.lambdaQuery(UserEntity.class);
    List<UserEntity> entities = query.andEq(UserEntity::getDepartmentId,1)
      .andIsNotNull(UserEntity::getName).select();
    */
    

    执行的时候会得到如下错误:

    Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: MainKt$sam$org_beetl_sql_core_query_LambdaQuery_Property$0.writeReplace()
    	at org.beetl.sql.core.query.LambdaQuery.getFunctionName(LambdaQuery.java:269)
    	at org.beetl.sql.core.query.LambdaQuery.andEq(LambdaQuery.java:46)
    	at MainKt.main(main.kt:22)
    	at MainKt.main(main.kt)
    Caused by: java.lang.NoSuchMethodException: MainKt$sam$org_beetl_sql_core_query_LambdaQuery_Property$0.writeReplace()
    	at java.lang.Class.getDeclaredMethod(Class.java:2130)
    	at org.beetl.sql.core.query.LambdaQuery.getFunctionName(LambdaQuery.java:255)
    	... 3 more
    

    JDK 使用 1.8 版本。请教大家这里该如何改写呢,非常感谢

    6 条回复    2021-09-08 18:29:11 +08:00
    chendy
        1
    chendy  
       2021-09-07 15:42:31 +08:00
    beetlsql 的这个机制应该是用 serializedlambda 实现的,但是目测 kotlin 的实现方式是匿名内部类,于是无解,换 java 写吧

    参考这里: https://discuss.kotlinlang.org/t/how-to-create-a-serializedlambda/8502/4
    cs419
        2
    cs419  
       2021-09-07 16:28:18 +08:00
    没用过 beetlsql
    用过 mybatis plus 的 lambda query
    不兼容 kotlin

    但是针对 kotlin 有另外的实现类
    你可以给 beetlsql 提建议 让他们加个实现
    Kimen
        3
    Kimen  
       2021-09-07 17:22:49 +08:00
    类名::属性就是调用类的静态方法,可以直接 UserEntity.Companion.getName()
    aguesuka
        4
    aguesuka  
       2021-09-07 18:16:41 +08:00
    @Kimen 估计没用, 从 java 的 Method References 是用的 SerializedLambda 的 hack. kotlin 的语法应该没法创建它的实例
    iseki
        5
    iseki  
       2021-09-08 00:18:27 +08:00
    Kotlin 需要库进行额外处理,你用的这个看上去不支持,建议翻翻文档,有些会针对 Kotlin 提供额外的扩展包
    cylee
        6
    cylee  
       2021-09-08 18:29:11 +08:00
    有移动端同学吗?头条商业化招 Android iOS : //https://www.v2ex.com/t/798022//
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:59 · PVG 19:59 · LAX 03:59 · JFK 06:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.