zslxq123 2021-08-13 14:53 采纳率: 66.7%
浏览 182
已结题

java使用lambda方法引用父类方法,如何获取当前类名的名称而不是父类的类名


package com.senzhikong.db.sql.wrapper;

import java.io.Serializable;
import java.util.function.Function;

@FunctionalInterface
public interface ObjectFunction<T extends Serializable, R> extends Function<T, R>, Serializable {
}
package com.senzhikong.db.entity;

import com.alibaba.fastjson.JSON;
import com.senzhikong.db.dialect.Comment;
import com.senzhikong.db.enums.CommonStatus;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.domain.Example;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Getter
@Setter
@MappedSuperclass
public class BaseEntity implements Serializable {
    /**
     * @Fields serialVersionUID
     */
    protected static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "status", length = 32)
    private String status;

    @Column(name = "updateTime", length = 26)
    private Date updateTime;

    @Column(name = "remark", length = 255)
    private String remark;
}


package com.senzhikong.tally.entity;

import com.senzhikong.db.entity.BaseEntity;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Getter
@Setter
@Entity
@Table(name = "tally_ledger")
public class TallyLedger extends BaseEntity{
    @Column(name = "title")
    private String title;
    @Column(name = "description")
    private String description;
    @Column(name = "memberId")
    private Long memberId;
}

package com.senzhikong.db.sql;

import java.lang.reflect.AccessibleObject;
import java.security.PrivilegedAction;

public class SetAccessibleAction<T extends AccessibleObject> implements PrivilegedAction<T> {
    private final T obj;

    public SetAccessibleAction(T obj) {
        this.obj = obj;
    }

    public T run() {
        this.obj.setAccessible(true);
        return this.obj;
    }
}

    import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.security.AccessController;
import com.senzhikong.db.sql.SetAccessibleAction;

public class WrapperParser{
      public static <R extends Serializable, S extends Serializable> void parseFunction(ObjectFunction<R, S> column) {
        try {
            Method method = column.getClass().getDeclaredMethod("readResolve");
            AccessController.doPrivileged(
                    new SetAccessibleAction<>(method));
            SerializedLambda serializedLambda = (SerializedLambda) method.invoke(column);

            String methodName = serializedLambda.getImplMethodName();
            String className = serializedLambda.getImplClass();
            System.out.println(className);
            //输出结果:::com/senzhikong/db/entity/BaseEntity
            //getId 方法是由父类继承的,这里拿到的是父类的类名,我想要获取实际使用的子类的类名应该怎么做
            //想要获取:::com/senzhikong/tally/entity/TallyLedger
        } catch (Exception e) {
            throw new RuntimeException("", e);
        }
    }

    public static void main(String[] args) {
        parseFunction(TallyLedger::getId );
    }
}
  • 写回答

2条回答 默认 最新

  • 关注

    可以把当前类对象的this对象传给父类,或者直接传当前类名给父类。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月10日
  • 已采纳回答 11月2日
  • 创建了问题 8月13日

悬赏问题

  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。