List>,String str,String str这是什么参数?List>的引用变量呢?
class对应的传入值就是类A或者是类B的实例。你确定是这样的?
你先把update×××的参数写清楚再说吧。还有类A和类B是否有共同的父类或接口。
追问:
类A和类B之间毫无关系,你就当做是两张表(table)的hibernate的映射类,只是这两个表之间存在一些相同的字段,如创建人、创建日期、创建机构等。我现在要做的就是要修改这几个字段的值,对应的执行方法为update×××,因为他们都有共同的字段,所以我想对入参做泛型化处理,就是第一个入参,我是否应该写成:public update×××(List t,String str)。
追答:
你的意思是让一个update方法能同时操作两个类?
既然是用hibernate,为什么update里的参数有List,有String?不应该是entity类么?
还有T只能代表一个类,不可能同时代表两个类。那还不如直接用Object类型,没必要用泛型。
追问:
这个update方法每次只调用一次而已,看传入的是类A的实例还是类B的实例,所以想做成泛型,不是一个方法里面操作两个类的实例。我传入的是类A或者类B的集合,所以需要用到List,你可以理解为批量修改
“那还不如直接用Object类型,没必要用泛型”===请问用Obejct如何实现?
追答:
既然A和B没有任何关系,那么就直接用Object类型,不用泛型。
然后在代码里判断类型,比如Object o,
那么就if(o.getClass() == A.class)
{
//XXXXX
}else if(o.getClass() == B.class)
{
//XXXX
}
这是最直接的类型鉴定。
我觉得还是你的接口设计的有问题,虽然这样可以解决你的问题,但会留下隐患。
直接用两个update方法就不会有问题了。
追问:
目前的只是过渡做法,后续我会把所有表中涉及到这几个字段赋值的地方剥离出来,考虑使用Spring的AOP方式来实现。
但是你的Object方法会产生很多冗余代码,如果我说我有上百个类,都有这几个字段,那岂不是要写上百次if判断,这样不可取的,我个人建议还是用泛型来解决,但是不清楚怎么写。
追答:
进行反射调用方法,因为相同的字段你也知道了,然后封装到一个共同的实体中,让hibernate保存到表中。
用反射,这样就不需要进行类型判断了,但前提是你那些字段,在你那几百个类中的getter方法名是一致的。
追问:
是的,是一模一样的,但是,具体应该如何实现呢?能否说具体一点。
追答:
List s;
利用Javabean的内省api
proName指的是方法名,如getName(),那么proName就是"name"。
s.getClass(),s是list里的对象,如果每次调用list里的每个对象类型是一致的话,只需要一次就行
PropertyDescriptor proDescriptor = new PropertyDescriptor(proName, s.getClass());
ethod methodGetX = proDescriptor.getReadMethod(); // 获取getter方法
Object objx = methodGetX.invoke(s); //执行getter方法,s是方法的调用者,objx 就是方法的返回值
你拿到返回值了,剩下的就没问题了吧?这里不需要任何类型限制,只需要方法名一致即可。
追问:
算了,我重新发帖吧,追问内容有长度限制,郁闷
http://zhidao.baidu.com/question/367934535741323324.html
用你的方法我想我应该解决了问题了。
追答:
恩,看了你的另一个连接。
按照你的需求就是反射获取setter,调用setter方法就行。