Java 将类名 + 对象传递给泛型方法
Java passing className + object to generic method
在 Android Java 我想要一个 MyDownloadHelper 下载和 return JSON 数据。这适用于两个具有不同 class/object 名称的单独文件。但是,我无法让它动态工作。
使用当前设置,我可以在另一个 activity 中调用 MySQLiteHelper.getRecipients();
,它将 return 正确的数据。我还使用两个 类(Pakbon,收件人)来设置正确的数据。
这是我当前的来源:
public class MyDownloadHelper {
private static final int timeout = 10000;
private Class<? extends Object[]> cls;
private static final String API_SERVER = "http://www.***.nl/json/";
private Object[] obj;
public MyDownloadHelper(){
}
protected Recipient[] getRecipients() {
try {
//Recipient[] recipients = getInstance(Recipient[].class);
Recipient[] recipients = this.download(Recipient[].class, API_SERVER + "getRecipients");
return recipients;
} finally {
return null;
}
}
protected Pakbon[] getPackingSlips() {
try {
Pakbon[] pakbon = this.download(Pakbon[].class, API_SERVER + "getPackingSlips");
return pakbon;
} finally {
return null;
}
}
private <T> Object[] download(Class<T> a, String url){
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
c.setConnectTimeout(timeout);
c.setReadTimeout(timeout);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
Object[] objectData = gson.fromJson(br, a);
return gson.fromJson(br, cls);
}
} catch (IOException ex) {
} finally{
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
}
在 Selvin 的帮助下解决。
public class MyDownloadHelper {
private static final int timeout = 10000;
private Class<? extends Object[]> cls;
protected static final String API_SERVER = "http://www.translog.nl/json/";
private Object[] obj;
public MyDownloadHelper(){
}
protected <T> T download(Class<T> a, String url) throws Exception {
HttpURLConnection c = null;
try {
URL u = new URL(API_SERVER + url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
c.setConnectTimeout(timeout);
c.setReadTimeout(timeout);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
return (T)gson.fromJson(br, a);
//return gson.fromJson(br, cls);
}
} catch (IOException ex) {
} finally{
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
}
在 Android Java 我想要一个 MyDownloadHelper 下载和 return JSON 数据。这适用于两个具有不同 class/object 名称的单独文件。但是,我无法让它动态工作。
使用当前设置,我可以在另一个 activity 中调用 MySQLiteHelper.getRecipients();
,它将 return 正确的数据。我还使用两个 类(Pakbon,收件人)来设置正确的数据。
这是我当前的来源:
public class MyDownloadHelper {
private static final int timeout = 10000;
private Class<? extends Object[]> cls;
private static final String API_SERVER = "http://www.***.nl/json/";
private Object[] obj;
public MyDownloadHelper(){
}
protected Recipient[] getRecipients() {
try {
//Recipient[] recipients = getInstance(Recipient[].class);
Recipient[] recipients = this.download(Recipient[].class, API_SERVER + "getRecipients");
return recipients;
} finally {
return null;
}
}
protected Pakbon[] getPackingSlips() {
try {
Pakbon[] pakbon = this.download(Pakbon[].class, API_SERVER + "getPackingSlips");
return pakbon;
} finally {
return null;
}
}
private <T> Object[] download(Class<T> a, String url){
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
c.setConnectTimeout(timeout);
c.setReadTimeout(timeout);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
Object[] objectData = gson.fromJson(br, a);
return gson.fromJson(br, cls);
}
} catch (IOException ex) {
} finally{
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
}
在 Selvin 的帮助下解决。
public class MyDownloadHelper {
private static final int timeout = 10000;
private Class<? extends Object[]> cls;
protected static final String API_SERVER = "http://www.translog.nl/json/";
private Object[] obj;
public MyDownloadHelper(){
}
protected <T> T download(Class<T> a, String url) throws Exception {
HttpURLConnection c = null;
try {
URL u = new URL(API_SERVER + url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
c.setConnectTimeout(timeout);
c.setReadTimeout(timeout);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
return (T)gson.fromJson(br, a);
//return gson.fromJson(br, cls);
}
} catch (IOException ex) {
} finally{
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
}