There is a variable

private Class clazz = Some.class; 

How to create from this variable

 new Some(); 

Until came to this:

 Object object = clazz.newInstance(); 

The fact is that it is not known which type will be received.

  public class GsonRequest<ResponseObject> extends Request<ResponseObject> { private final Gson gson = new Gson(); private Class clazz; private final Map<String, String> headers = new HashMap<String, String>(); private final Listener<ResponseObject> listener; private ApiEnum ae; private Object object; /** * Make a GET request and return a parsed object from JSON. * * @param url URL of the request to make * @param clazz Relevant class object, for Gson's reflection * @param headers Map of request headers */ public GsonRequest(String url, ApiEnum ae, Class clazz, Listener<ResponseObject> listener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = listener; this.ae = ae; this.clazz = clazz; /*switch (ae) { case SESSION: this.clazz = SessionRequest.class; break; case CATEGORIES: this.clazz = Categories.class; break; }*/ try { object = clazz.newInstance(); } catch (IllegalAccessException e) {} catch (InstantiationException e) {} } @Override public Map<String, String> getHeaders() throws AuthFailureError { headers.put("Id", "123"); return headers; } @Override protected void deliverResponse(ResponseObject response) { listener.onResponse(response); } @Override protected Response<ResponseObject> parseNetworkResponse(NetworkResponse response) { try { String json = new String( response.data, HttpHeaderParser.parseCharset(response.headers)); object = gson.fromJson(json, clazz); ResponseObject r = (ResponseObject) new BaseResponse().setAnswer(object); // В ResponseObject метод setAnswer не вызывается return Response.success( r, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } } 

ResponsiObject:

 public class ResponseObject { @Nullable private Object mAnswer; private RequestResult mRequestResult; public ResponseObject() { mRequestResult = RequestResult.ERROR; } @NonNull public RequestResult getRequestResult() { return mRequestResult; } public ResponseObject setRequestResult(RequestResult requestResult) { mRequestResult = requestResult; return this; } @Nullable public <T> T getTypedAnswer() { if (mAnswer == null) { return null; } //noinspection unchecked return (T) mAnswer; } public ResponseObject setAnswer(@Nullable Object answer) { mAnswer = answer; return this; } public void save(Context context) { } } 

Base Response:

 public class BaseResponse extends ResponseObject { } 

Activity:

 private Response.Listener<ResponseObject> myReqSuccessListener() { return new Response.Listener<ResponseObject>() { @Override public void onResponse(ResponseObject response) { if (response.getTypedAnswer() instanceof SessionRequest) { SessionRequest session = response.getTypedAnswer(); //... } else if (response.getTypedAnswer() instanceof Categories) { Categories categories = response.getTypedAnswer(); } }; } 
  • Uh-uh ... Some some = (Some) clazz.newInstance(); ??? - Yuriy SPb
  • There are a limited number of types, as I understand it, which means you can make a switch by type and in it cast the resulting object to a specific type. - YurySPb
  • The option that I use works, I just want to know how to do it right. - yury
  • In fact, the correct answer depends on what you need this Object object for. If just to be and do not care what class, then everything is correct and so. this.clazz is clearly superfluous. - Sergey
  • I make a request using volley, Class class is the model of json that I get, there are several of them - yury

1 answer 1

 Object o; Class clazz; switch (ae) { case SESSION: clazz = SessionRequest.class; break; case CATEGORIES: clazz = Categories.class; break; } if(clazz == null) { log.error("class {} not found!", clazz.getName()); return; } try { o = clazz.newInstance(); } catch(Exception e) { log.error("Failed creating instance of {}", e, clazz.getName()); return; } 

And you don’t have to override the constructor with extra parameters - you complicate initialization yourself.