问题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;
}
Generik telah dipadamkan selepas kompilasi Jvm tidak dapat melihat maklumat generik sama sekali Ini disebabkan oleh sebab sejarah, jadi p.getClass yang anda nyatakan tidak boleh wujud
Soalan pertama adalah idea yang bagus, tetapi sejauh yang saya tahu, ia tidak boleh direalisasikan kaedah dalam antara muka
Saya rasa soalan pertama ialah anda fikir anda boleh mendapatkan pembolehubah ahli subkelas kerana anda berpendapat bahawa sebaik sahaja kaedah toString subkelas dilaksanakan selepas pewarisan, anda sendiri ini juga akan dipanggil salah. Pada masa berjalan, jvm akan memperoleh kaedah ini daripada ruang objek kelas induk dan melaksanakannya. Oleh itu, tidak kira apa pun, mereka hanyalah pembolehubah ahli kelas induk
Saya membuat kesilapan dalam bahagian yang dicondongkan di atas Selepas menjalankan IDE untuk mengujinya, saya mendapati bahawa saya salah tentang apa yang saya fahami sebelum ini.
Kod yang disiarkan di bawah boleh gelung untuk mendapatkan semua pembolehubah daripada subkelas kepada kelas induk. Semoga ini membantu
Kelas alat refleksi
Soalan 1
Soalan 2
Masalah pertama boleh diselesaikan menggunakan commons-beanutils.