gpt4 book ai didi

通用类型上的 java getMethod()

转载 作者:行者123 更新时间:2023-11-30 08:30:39 29 4
gpt4 key购买 nike

我想在泛型上使用反射

我有这门课

package it.ciro.service;

import it.ciro.dao.SysMyAbDao;
import org.apache.log4j.Logger;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
* Created by ciro on 09/12/2016.
*/
public class SelectOption<E extends Serializable> {

private SysMyAbDao dao;
private Class<E> entity;
private ArrayList<Class<E>> entityAll;
private Map<String,String> optionList = new HashMap<String,String>();
protected Logger logger;

public SelectOption(SysMyAbDao dao,Class<E> entity,String idName, String labelName ){
logger = Logger.getLogger(this.getClass());

this.dao = dao;
this.entity = entity;
entityAll = dao.findAll();
try{
Method idMethod = this.entity.getMethod(idName);
Method labelMethod = this.entity.getClass().getMethod(labelName);
for (Class<E> single : entityAll) {
optionList.put((String)idMethod.invoke(single),(String)labelMethod.invoke(single));
}
}catch (NoSuchMethodException ex){
ex.printStackTrace();
logger.error(ex.getMessage());
} catch (InvocationTargetException e) {
logger.error(e.getMessage());
} catch (IllegalAccessException e) {
logger.error(e.getMessage());
}
}

public Map<String, String> getOptionList() {
return optionList;
}
}

在我的 Controller 中

SelectOption<GeoProvince> selectOption = new SelectOption(geoRegionDao,GeoRegion.class,"idGeoRegion","name");   

但是我明白了

java.lang.NoSuchMethodException: java.lang.Class.idGeoRegion()

java 搜索泛型 e 而不是我在构造函数中使用的类型

我希望搜索是关于我在 Controller 中花费的类型。在 GeoRegion 类中存在该方法。

这是 SysMyAbDao

public abstract class SysMyAbDao<T, E, Id extends Serializable> {
protected String message;
protected Boolean status;
protected T t ;
protected Logger logger;
protected Long totalRow;
private Class<T> type;

public SysMyAbDao(Class<T> type){
this.type = type;
}
.....

地理区域类

public class GeoRegion  implements java.io.Serializable {

private int idRegion;
private String name;
private String code;
private Set<GeoProvince> geoProvinces = new HashSet<GeoProvince>(0);
private Set<GeoCity> geoCities = new HashSet<GeoCity>(0);

public GeoRegion() {
}


public GeoRegion(int idRegion) {
this.idRegion = idRegion;
}
public GeoRegion(int idRegion, String name, String code, Set<GeoProvince> geoProvinces, Set<GeoCity> geoCities) {
this.idRegion = idRegion;
this.name = name;
this.code = code;
this.geoProvinces = geoProvinces;
this.geoCities = geoCities;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id_region", unique=true, nullable=false)
public int getIdRegion() {
return this.idRegion;
}

public void setIdRegion(int idRegion) {
this.idRegion = idRegion;
}


@Column(name="name")
public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}


@Column(name="code", unique=true)
public String getCode() {
return this.code;
}

public void setCode(String code) {
this.code = code;
}

@OneToMany(fetch=FetchType.LAZY, mappedBy="geoRegion")
public Set<GeoProvince> getGeoProvinces() {
return this.geoProvinces;
}

public void setGeoProvinces(Set<GeoProvince> geoProvinces) {
this.geoProvinces = geoProvinces;
}

@OneToMany(fetch=FetchType.LAZY, mappedBy="geoRegion")
public Set<GeoCity> getGeoCities() {
return this.geoCities;
}

public void setGeoCities(Set<GeoCity> geoCities) {
this.geoCities = geoCities;
}
}

最佳答案

你有一个额外的 getClass()在这一行中:

Method labelMethod = this.entity.getClass().getMethod(labelName);

实际上,您正在调用 getClass()Class<E> 上目的。并且作为 Class<E> 的类不是 E但是java.lang.Class你得到 NoSuchMethodException你发布了。

此外,您调用方法的实例(在您的情况下为 single)的类型应为 E而不是 Class<E> 类型.

总的来说,你最终会得到这样的结果:

public SelectOption(SysMyAbDao<E, ?, ? extends Serializable> dao,
Class<E> entityClass,
String idName,
String labelName) {
this.dao = dao;
this.entityClass = entityClass;
this.entityAll = dao.findAll(); // make sure your SysMyAbDao<E, ?, ?>#findAll() returns a Collection<E>
try{
Method idMethod = this.entityClass.getMethod(idName);
Method labelMethod = this.entityClass.getMethod(labelName);
for (E instance : entityAll) {
optionList.put((String)idMethod.invoke(instance),(String)labelMethod.invoke(instance));
}
} catch (NoSuchMethodException ex){
...
}
}

关于通用类型上的 java getMethod(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41069450/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com