- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在泛型上使用反射
我有这门课
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/
我是 Java8 的新手,我创建了这段运行良好的代码 userService.getClient().findUsersByMarkets(marketIds) .s
我知道我可以使用 GetMethods 获取方法信息,但我想知道如何在没有 GetMethods 的情况下正确执行此操作。我读过其他 SO 问题和答案,这些问题和答案表明这是不可能的,或者建议只使用
我有一个使用 JMF 库的小程序,名称如下: Applet error 然后我调用一个 javascript 函数: var c
我正在编写一个使用反射来动态查找和调用方法的库。只给定一个对象、一个方法名称和一个参数列表,我需要调用给定的方法,就好像该方法调用已明确写入代码中一样。 我一直在使用以下方法,在大多数情况下都有效:
我正在研究 Java 反射的基础知识并观察有关类方法的信息。我需要获得一个符合 getMethod() 函数描述的规范的方法。然而,当我这样做时,我得到了一个 NoSuchMethodExceptio
我最终想要做的是以某种方式调用所有具有注释的方法: 覆盖的方法只会被调用一次。 如果对象的类是 B ,它继承自 A继承自 Object , 我想要 Object 中定义的方法首先调用该注释,然后调用
这个问题已经有答案了: How to I find specific generic overload using reflection? (4 个回答) 已关闭 8 年前。 我有一个包含两个方法的类
这个问题已经有答案了: What is the ellipsis (...) for in this method signature? (5 个回答) 已关闭 9 年前。 我正在尝试使用 getMe
这个问题已经有答案了: How to I find specific generic overload using reflection? (4 个回答) 已关闭 8 年前。 我有一个包含两个方法的类
我正在使用 getMethod(String name) 函数加载方法,但它总是抛出 MethodNotFoundException。如果我运行 class.getMethods() ,我要查找的方法
在 java 中,方法“Class.getMethods()”返回接收者类及其父类(super class)中所有方法的数组。是否有像 Class.getMethods() 这样的方法,它只为我们提供
我只是在我编写的几个解析器中重构了一段通用代码。该代码用于自动发现方法实现,它非常方便扩展现有解析器或使用更多 DRY 代码(尤其是我一个人在做这个项目): [AttributeUsage(Attri
我想在泛型上使用反射 我有这门课 package it.ciro.service; import it.ciro.dao.SysMyAbDao; import org.apache.log4j.Log
我正在使用 getMethod(String name, Class[] types) 方法来获取方法,但当有 int 参数时,我得到一个未找到的方法。我想我明白了,因为在我的 Class 数组中我有
在使用 getMethod() 时,我遇到了一个问题。我正在调用 getMethod() 的类有许多父方法。但是,我不希望 getMethod 注意到父类的方法,只希望看到我正在查看的特定类。例如……
是否可以调用参数对象或参数类是子类并且方法本身将父类(super class)作为参数的方法? 我试图通过抽象类 Problem 的具体实现来调用此方法 public void setNewProbl
我有以下类树: public class A { public static object GetMe(SomeOtherClass something) { retu
foreach(var filter in filters) { var filterType = typeof(Filters); var method = filterType.G
我正在使用一个自动生成的 Java 类来执行一个特殊的方法。因此,我必须通过反射调用该方法。 此执行由 Swing 线程触发,因为该方法(从“未知”类调用)正在更新 UI 元素。新线程的每次执行都是通
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicates: Java Reflection: Getting fields and methods in declar
我是一名优秀的程序员,十分优秀!