为了账号安全,请及时绑定邮箱和手机立即绑定

如何使泛型函数根据 Java 中的输入获取对象属性

如何使泛型函数根据 Java 中的输入获取对象属性

繁华开满天机 2023-05-17 14:41:45
我有如下的 Java 实体@Entity@Table(name = "user", schema = "xxxx")public class User extends AuditableBase<Long> {  /** The Constant serialVersionUID. */  private static final long serialVersionUID = -5827659402853250569L;  public static final String FTL = "FTL";  /** The refer number. */  @Column(name = "reference_number")  private String referenceNumber;  /** The customer id. */  @OneToOne(fetch = FetchType.LAZY)  @JoinColumn(name = "customer_id")  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)  private Customer customer;  /** The load Notes. */  @OneToMany(cascade = CascadeType.ALL, mappedBy = "load")  @JsonBackReference  private Set<Notes> notes = new HashSet<>();  /** The customer location. */  @OneToOne(fetch = FetchType.LAZY)  @JoinColumn(name = "customer_location_id")  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)  private CustomerLocation customerLocation;  /** The invoice number. */  @Column(name = "invoice_number")  private String invoiceNumber;  // Lot going  /**   * Instantiates a new User.   */  public User() {    super();  }  /**   * Instantiates a new User.   *   * @param id   *          the id   */  public User(Long id) {    super(id);  }}我在实体内部有很多孩子,我从 DAO 调用中获取对象User user = userRepository.findById(userId);现在我想根据一些引用 Map 的 if 条件获取一些用户详细信息。Map<Integer, String> cc = new HashMap<Integer, String>();cc.put(1, "getCustomer()");cc.put(2, "getNotes()");cc.put(3, "getCustomerLocation()");cc.put(4, "getReferenceNumber()");for (Entry<Integer, String> map : cc.entrySet()) {    user.map.getvalue();}我需要创建一个通用方法来根据地图获取用户对象。我怎样才能做到这一点。
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

不确定我是否完全理解你的问题,但你可以这样做:


        Map<Integer,Method> cc = new HashMap<>();

        cc.put(1, User.class.getDeclaredMethod("getCustomer"));

        cc.put(2, User.class.getDeclaredMethod("getNotes"));

        cc.put(3, User.class.getDeclaredMethod("getCustomerLocation"));

        cc.put(4, User.class.getDeclaredMethod("getReferenceNumber"));


        for (Entry<Integer, Method> map : cc.entrySet()) {

            Integer index = map.getKey();

            Method getter = map.getValue();

            Object value = getter.invoke(user);

            doSomethingUsefulWith(index, value);

        }

更新:


你可以Getter像这样声明一个接口:


public interface Getter<T,R> {

    public R get(T obj);

}

然后做这样的事情:


    Map<Integer,Getter<User,?>> cc = new HashMap<>();

    cc.put(1, (u) -> u.getCustomer().getName());

    cc.put(2, (u) -> u.getNotes());

    cc.put(3, (u) -> u.getCustomerLocation());

    cc.put(4, (u) -> u.getReferenceNumber());

    for (Entry<Integer,Getter<User,?>> map : cc.entrySet()) {

        Integer index = map.getKey();

        Getter<User,?> getter = map.getValue();

        Object value = getter.get(user);

        doSomethingUsefulWith(index, value);

    }


查看完整回答
反对 回复 2023-05-17
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信