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

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日

悬赏问题

  • ¥15 爬取豆瓣电影相关处理
  • ¥15 手机淘宝抓清除消息接口
  • ¥15 C#无selenium
  • ¥15 LD衰减计算的结果过大
  • ¥15 用机器学习方法帮助保险公司预测哪些是欺诈行为
  • ¥15 计算300m以内的LD衰减
  • ¥15 数据爬取,python
  • ¥15 怎么看 cst中一个面的功率分布图,请说明详细步骤。类似下图
  • ¥15 为什么我的pycharm无法用pyqt6的QtWebEngine
  • ¥15 FOR循环语句显示查询超过300S错误怎么办