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

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 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)