如何在 java 中使用“.class”从类对象获取原始类类型?

How to get original Class type from Class object using ".class" in java?

提问人:nick_j_white 提问时间:2/20/2023 更新时间:2/20/2023 访问量:69

问:

作为抽象泛型 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 到此类的强制转换。

Java 转换

评论

1赞 Johannes Kuhn 2/20/2023
使通用。MyRequest
2赞 Tim Moore 2/20/2023
许多代码示例无法编译,因此很难解决问题。将来,请确保您的代码示例可以复制和编译/运行。声明您的依赖项也很有帮助(或者更好的是,重写代码以消除它们)。

答:

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) {
    }
}

然后,将指定为参数的值:ExampleRequestMyResponse

public class ExampleRequest extends MyRequest<MyResponse> {
   // ... no other changes
}

然后,在实现时不再需要强制转换:onSuccess

new ExampleRequest("exampleParamValue"){
    @Override
    public void onSuccess(MyResponse response){
        String StatusCode = response.getStatusCode();
    }
};