提问人:nick_j_white 提问时间:2/20/2023 更新时间:2/20/2023 访问量:69
如何在 java 中使用“.class”从类对象获取原始类类型?
How to get original Class type from Class object using ".class" in java?
问:
作为抽象泛型 API 函数的一部分,我在构造函数中包含一个类型为“Class”的参数,该参数用于将响应(JSON 格式)反序列化为该类类型的对象。 每个 API 调用可以具有不同的响应类。
目前,我的父类定义是:
public MyRequest {
private int method;
private String url;
private Class responseClass;
private @Setter JSONObject params;
public MyRequest(int method, String url, Class responseClass){
this.method = method;
this.url = url;
this.responseClass = responseClass;
}
public void executeRequest(){
new HttpJsonRequest(method,url,params) {
@Override
public void handleResponse(JSONObject response) {
Object responseObj = new Gson().fromJson(String.valueOf(response), responseClass);
onSuccess(responseObj);
}
...
}
}
public void onSuccess(Object response){}
...
}
扩展此内容的示例 API 请求:
public class ExampleRequest extends MyRequest {
public ExampleRequest(String exampleParam){
super(Request.Method.POST, "/example", MyResponse.class);
JSONObject params = new JSONObject();
params.put("exampleParam",exampleParam);
setParams(params);
executeRequest();
}
}
使用基本响应类:
@AllArgsConstructor
@NoArgsConstructor
public MyResponse {
private @Getter @Setter String StatusCode;
}
为了使用上面的 API 类,我重写了返回 Generic 对象的 onSuccess 方法,并在继续之前将其转换回 responseClass,例如:
new ExampleRequest("exampleParamValue"){
@Override
public void onSuccess(Object response){
String StatusCode = ((MyResponse) response).getStatusCode();
...
}
}
有没有办法修改 MyRequest,以便 responseObj 不是类“Object”,而是可以是传递给构造函数的任何类? 我想避免在我使用的每个 onSucccess 覆盖中执行从 Object 到此类的强制转换。
答:
1赞
Tim Moore
2/20/2023
#1
您可以通过将 generic 设置为响应类型的 type 参数来解决此问题:MyRequest
import com.google.gson.Gson;
import lombok.Setter;
import org.json.JSONObject;
public class MyRequest<R> {
private int method;
private String url;
private Class<R> responseClass;
private @Setter JSONObject params;
public MyRequest(int method, String url, Class<R> responseClass) {
this.method = method;
this.url = url;
this.responseClass = responseClass;
}
public void executeRequest() {
new HttpJsonRequest(method, url, params) {
@Override
public void handleResponse(JSONObject response) {
R responseObj = new Gson().fromJson(String.valueOf(response), responseClass);
onSuccess(responseObj);
}
};
}
public void onSuccess(R response) {
}
}
然后,将指定为参数的值:ExampleRequest
MyResponse
public class ExampleRequest extends MyRequest<MyResponse> {
// ... no other changes
}
然后,在实现时不再需要强制转换:onSuccess
new ExampleRequest("exampleParamValue"){
@Override
public void onSuccess(MyResponse response){
String StatusCode = response.getStatusCode();
}
};
评论
MyRequest