在java函数中将类作为参数传递

时间:2015-01-13 16:39:09

标签: java json

我试图将Java类作为参数传递给函数,其背后的原因是我有几个针对不同API的pojo类,我试图为所有API URL和pojo类创建一个解析器实用程序,我试过了很少或没有成功。

下面是代码示例 -

   public class util {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        List<JsonGenMovies> jsongen = null;
        String url = "http://www.dishanywhere.com/radish/v20/dol/movies/carousels/featured.json?nkey=0e1345ee597cf280c8a2cde367b6b894";
        getMovieParser(jsongen, url);

        List<JsonGenShow> jsongenShow = null;
        String URL = "http://www.dishanywhere.com/radish/v20/dol/shows/carousels/featured.json";
        getShowParser(jsongenShow, URL);
    }

    public static String[] getMovieParser (List<JsonGenMovies> jsongen, String url ) throws JsonParseException, JsonMappingException, IOException
    {
        URL jsonUrl = new URL(url);
        ObjectMapper objmapper = new ObjectMapper();
        jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGenMovies>>() {});
        String[] shows = new String [jsongen.size()]; 
        int i = 0;
        for(JsonGenMovies element : jsongen) {
            shows[i++]=element.getName();
        }
        for(int j =0; j<shows.length;j++)
        {
            System.out.println(shows[j]);
        }
        return shows;   
    }

    public static String[] getShowParser (List<JsonGen> jsongenShow, String URL ) throws JsonParseException, JsonMappingException, IOException
    {
        URL jsonUrl = new URL(URL);
        ObjectMapper objmapper = new ObjectMapper();
        jsongenShow = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {});
        String[] shows = new String [jsongenShow.size()]; 
        int i = 0;
        for(JsonGen element : jsongenShow) {
            shows[i++]=element.getName();
        }
        for(int j =0; j<shows.length;j++)
        {
            System.out.println(shows[j]);
        }
        return shows;   
    }
}

在行 -

jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {});

我仍然有<List<JsonGen>>一个硬编码的类名,我试图用参数替换它。如果你能提供帮助,请。

请回答一点解释,一个班轮可能不是我的事。

此致 石

1 个答案:

答案 0 :(得分:2)

如果我理解正确你想要一个功能而不是两个或更多功能 您可以使用generic type

执行此操作

E.g

public static <T> String[] getParser(List<T> jsongen, String url) throws JsonParseException, JsonMappingException, IOException {
  URL jsonUrl = new URL(url);
  ObjectMapper objmapper = new ObjectMapper();
  jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<T>>() {
  });

  String[] shows = new String[jsongen.size()];
  int i = 0;
  for (T element : jsongen) {
    shows[i++] = element.getName();
  }

  for (int j = 0; j < shows.length; j++) {
    System.out.println(shows[j]);
  }
  return shows;
 }

如果JsonGenMoviesJsonGen都扩展/实现了一个界面或类,请注意JsonGenMovies extends Json,然后您就可以执行此操作:

public static <T extends Json> String[] getParser(List<T> jsongen, String url)

T是一个泛型类型,它实际上并不存在,但它将在运行时被用于jsongen arg的类替换。

例如:

List<String> myList;
getParser(myList, "http://blablabla.blalb.com");

所有T都被String替换。

我希望这就是你要找的东西 您可以找到有关泛型类型here的更多解释,并提供比我更好的解释。

编辑:

如果你想保留你的POJO模式,那么你可以尝试这个(不确定它是否可行)

public static String[] getParser(List<?> jsongen, String url) throws Exception {
  URL jsonUrl = new URL(url);
  ObjectMapper objmapper = new ObjectMapper();
  jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<?>>() {
  });
  String[] shows = new String[jsongen.size()];
  int i = 0;
  for (Object element : jsongen) {
    Method method = element.getClass().getMethod("getName");
    shows[i++] = (String) method.invoke(element);
  }

  for (int j = 0; j < shows.length; j++) {
    System.out.println(shows[j]);
  }

  return shows;
}