在Java中从给定的Class对象创建对象

时间:2016-08-23 16:41:34

标签: java reflection instance

有关在给定Class对象时创建对象的快速问题。或许我需要以不同的方式解决这个问题。首先是我的计划,我正在编写一个方法,它将获取一个File对象数组,并将每个对象读入一个Set,然后将每个集合附加到一个列表并返回列表。以下是我的内容:

private static List<Set<String>> loadFiles(File[] files, Class whatType, Charset charSet){
    List<Set<String>> setList = new ArrayList<Set<String>>(files.length);

    try {
        for(File f : files){
            BufferedInputStream bs = new BufferedInputStream(new FileInputStream(f));
            InputStreamReader r = new InputStreamReader(bs, charSet);
            BufferedReader br = new BufferedReader(r);

            Set<String> set = new HashSet<>(); //This is the problem line
            String line = null;

            while( (line = br.readLine()) != null){
                set.add(line.trim());

            }

            br.close();
            setList.add(set);
        }

        return setList;
    } catch (FileNotFoundException e) {
        //Just return the empty setlist
        return setList;
    } catch (IOException e) {
        //return a new empty list
        return new ArrayList<Set<String>>();
    }
}

但我想要的是允许方法的用户指定要实例化的Set的类型(只要它当然包含字符串)。这就是'whatType'参数的用途。

我所有的研究都引导我如何在给出类名的情况下实例化一个对象,但这不是我在这里的真实情况。

3 个答案:

答案 0 :(得分:2)

如果您可以使用Java8,则可以轻松解决此问题。声明方法如下:

private static List<Set<String>> loadFiles(File[] files, Supplier<Set> setSupplier, Charset charSet)

将问题行更改为:

Set<String> set = setSupplier.get();

然后,在每次调用此方法时,可以使用方法引用轻松提供 setSupplier 参数:HashSet :: new,TreeSet :: new ...

答案 1 :(得分:2)

如何使用Class.newInstance()方法?我为你编写了一个简单的例子:

public <T extends Set> void myMethod(Class<T> type) {
  T object;
  try {
    object = type.newInstance();
  } catch (InstantiationException e) {
    e.printStackTrace();
  } catch (IllegalAccessException e) {
    e.printStackTrace();
  }
}

public void caller() {
  myMethod(HashSet.class);
}

这是你在找什么?

答案 2 :(得分:1)

如果您认为该类具有无参数的可访问构造函数,那么您基本上只需newInstance()来电:

Set<String> set = (Set<String) whatType.newInstance();

请注意,如果您将whatType定义为Class<? extends Set>而不仅仅是原始Class,那么您也可以摆脱这种丑陋的演员。