问题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;
}
PHPz2017-04-18 10:53:04
컴파일 후 제네릭이 지워졌습니다. 이는 역사적 이유로 인해 제네릭 정보를 전혀 볼 수 없기 때문에 언급한 p.getClass가 존재할 수 없습니다.
첫 번째 질문은 좋은 생각이지만 제가 아는 한 객체는 하위 클래스의 상태를 알 수 없습니다. Java의 다형성 메커니즘은 상위 클래스 또는 상위 클래스에서만 학습할 수 있습니다. 인터페이스의 메소드
첫 번째 질문은 하위 클래스의 toString 메서드가 상속 후 실행되면 자신의 this도 호출될 것이라고 생각하기 때문에 하위 클래스의 멤버 변수를 얻을 수 있다고 생각하는 것 같습니다. 잘못된. 런타임 시 jvm은 상위 클래스의 객체 공간에서 이 메소드를 가져와 실행합니다. 따라서 어찌됐든 상위 클래스의 멤버 변수일 뿐입니다
위 이탤릭체 부분에 실수가 있었습니다. IDE를 실행하여 테스트해 본 결과, 이전에 제가 이해한 내용이 틀렸다는 것을 알게 되었습니다. 질문자에게 폐를 끼치지 않았으면 좋겠습니다.
아래에 게시된 코드는 루프를 통해 하위 클래스에서 상위 클래스까지 모든 변수를 가져올 수 있습니다. 이것이 도움이 되기를 바랍니다