问题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;
}
Les génériques ont été effacés après la compilation. Le jvm ne peut pas du tout voir les informations génériques. Cela est dû à des raisons historiques, donc le p.getClass que vous avez mentionné ne peut pas exister
.La première question est une bonne idée, mais pour autant que je sache, elle ne peut pas être réalisée. L'objet ne peut pas connaître l'état de la sous-classe. Le mécanisme polymorphe de Java ne peut apprendre que de la classe parent ou de la classe parent. méthodes dans l'interface
Je suppose que la première question est que vous pensez pouvoir obtenir les variables membres d'une sous-classe parce que vous pensez qu'une fois la méthode toString de la sous-classe exécutée après l'héritage, la vôtre sera également appelée. faux. Au moment de l'exécution, le jvm obtiendra cette méthode à partir de l'espace objet de la classe parent et l'exécutera. Par conséquent, quoi qu’il arrive, ce ne sont que des variables membres de la classe parent
J'ai fait une erreur dans la partie en italique ci-dessus. Après avoir exécuté l'EDI pour le tester, j'ai découvert que j'avais tort sur ce que j'avais compris auparavant. J'espère que cela n'a pas causé de problèmes à la personne qui pose la question.
Le code publié ci-dessous peut boucler pour obtenir toutes les variables de la sous-classe à la classe parent. J'espère que cela aide
Classe d'outils de réflexion
Question 1
Question 2
Le premier problème peut être résolu en utilisant commons-beanutils.