如何用类名取类型

dadacool 2009-02-07 11:39:34


public Collection getDetailsCByDetailClass(String parentId,Class detailClass) {
Collection detailVoC = new ArrayList();

final List list = detailService.getDetailsCByDetailClass(parentId,detailClass);//查找数据
int i = list.size();
for (int j = 0; j < i; j++) {

WriteoffDetail entity = (WriteoffDetail) list.get(j);//提问的地方
WriteoffDetailVo vo = this.getDetailVoByEntity(entity);//poTOvo
detailVoC.add(vo);
}
return detailVoC;
}
这里用了一个类WeiteoffDetail,它有三个子类,我是通过传入的datailClass确定插数据库的时候查找的表,以减少左连造成的开销。但是这里有个问题,list里面的对象类型跟传入的detailClass一致,如何通过Class取类型?
...全文
172 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
helei123a 2009-02-11
  • 打赏
  • 举报
回复
反射
cocy_chan 2009-02-11
  • 打赏
  • 举报
回复
如:

public abstract class WeiteoffDetail
{
public abstract void getDetailVoByEntity(WeiteoffDetail wd);
}

public class WeiteoffDetailSubclass1 extends WeiteoffDetail
{
@Override
public void getDetailVoByEntity(WeiteoffDetail wdc1)
{
System.out.println(wdc1);
}
}

public class WeiteoffDetailSubclass2 extends WeiteoffDetail
{
@Override
public void getDetailVoByEntity(WeiteoffDetail wdc2)
{
System.out.println(wdc2);
}
}

测试类:
import java.util.ArrayList;
import java.util.List;

public class TestClass
{
public static void main(String[] args)
{
List<WeiteoffDetail> list = new ArrayList<WeiteoffDetail>();
list.add(new WeiteoffDetailSubclass1());
list.add(new WeiteoffDetailSubclass2());
for (WeiteoffDetail list2 : list)
{
list2.getDetailVoByEntity(list2);
}
}
}
cocy_chan 2009-02-11
  • 打赏
  • 举报
回复
多态!
加判断,代码显得很冗余。
thought444 2009-02-11
  • 打赏
  • 举报
回复
接口
hx_huang 2009-02-11
  • 打赏
  • 举报
回复

用接口来实现!!
老紫竹 2009-02-09
  • 打赏
  • 举报
回复
如何通过Class取类型?


你为何要判断,这应该是多态解决的问题啊?

写一个接口,或者基类,然后实现你要的某些方法,然后直接操作就行了。

具体哪个做,那是具体的类来做。
fosjos 2009-02-08
  • 打赏
  • 举报
回复
list里面的对象类型跟传入的detailClass一致

这样应该是detailService.getDetailsCByDetailClass(parentId,detailClass);的问题,不过hibernate没这个问题
Inhibitory 2009-02-07
  • 打赏
  • 举报
回复
直接使用getClass()得到这个对象的类型, 与传入的detailClass比较, 相同刚是一同一类型. 同一个类的所有对象的getClass()得到的都是同一个静态的class对象.
如A extends B, B x = new A(); 则x.getClass()得到的是A.class对象, 而不是B.class对象. x.getClass() == A.class是true.
for (int j = 0; j < i; j++) {
WriteoffDetail entity = (WriteoffDetail) list.get(j);//提问的地方
if (entity.getClass() == WriteOffDetailSubclass1.class) {
进行第一种处理
} else if (entity.getClass() == WriteOffDetailSubclass2.class) {
进行第二种处理
} else if (entity.getClass() == WriteOffDetailSubclass3.class) {
进行第三种处理
}
WriteoffDetailVo vo = this.getDetailVoByEntity(entity);//poTOvo
detailVoC.add(vo);
}

还有, Class类可以取得这个类的所有信息, 如类名Class.getName(), 取得所有的函数以及此函数的参数列表类型, 构造函数, 所有的属性, 和接口, 父类等. 反射就可以使用Class的这些能力, 来做到非常多的事.

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧