问题1:
想写个requestInfo的toString方法,把所有的成员变量都打印出来,子类就不用每次都写个toString方法了,但是父类怎么获取子类成员变量的值?
public class RequestInfo
{
public String toString()
{
StringBuilder sb = new StringBuilder();
Field[] fields = this.getClass().getDeclaredFields();
for(Field field : fields)
{
sb.append(field.getName(), " = ", (这里怎么获取属性值?), ";");
}
return "";
}
}
问题2
下面那个类P怎么实例化,也没懂错误的原因,用P.getClass()还是不行
public abstract class AbstractService<Q extends RequestInfo, P extends ResponseInfo>
{
public static final Logger LOGGER = LoggerFactory.getLogger(AbstractService.class);
private String logTag;
private P respBean;
public P execute(Q reqBean)
{
init();
LOGGER.info(StringUtil.appendStr("Request : {}, req = {}", logTag, reqBean.toString()));
try
{
if (checkInput(reqBean))
{
handle(reqBean, respBean);
}
else
{
throw new Exception(StringUtil.appendStr(logTag, " check input param invalid"));
}
}
catch (Exception e)
{
LOGGER.error(StringUtil.appendStr(logTag, " Exception: "), e);
}
return respBean;
}
protected void init()
{
logTag = getClass().getSimpleName();
respBean =P.class.newInsance();//这里报错,cannot select from a type variable
}
protected boolean checkInput(Q reqBean)
{
return true;
}
protected abstract void handle(Q reqBean, P respBean)
throws Exception;
}
泛型,在编译之后,就已经被擦除了,jvm根本看不到泛型的信息,这点是由于历史遗留原因导致的,所以你说的p.getClass是不可能存在的
第一个问题,想法很好,但是,据我所知是无法实现的,对象是无法获知子类的情况的,java的多态机制也只能是从父类或者父接口中查询方法
我猜第一个问题你会觉得可以获取子类的成员变量是觉得继承之后子类的toString方法一执行,也会调用自己的this,这是错误的。在运行的时候,jvm会从父类的对象空间获取这个方法并执行。所以,怎么搞都只是父类的成员变量
上述斜体的地方我说错了,开了IDE测试了一下之后,对于自己之前理解的地方有误,希望没造成题主的困扰。
下面贴的这段代码,就可以循环获取从子类到父类的所有变量。希望能有帮助
反射工具类
问题1
问题2
第一个问题可以利用commons-beanutils做。