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



关于在给定class对象时创建对象的快速问题。或许我需要换个方式。首先,我将编写一个方法,该方法将接受File对象数组,并将每个对象读入Set,然后将每个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的类型(当然,只要它包含string)。这就是"whatType"参数的作用。

我所有的研究都导致我如何实例化一个给定类名的对象,但这并不是我在这里真正想要的。

如果可以使用Java8,就可以轻松解决这个问题。按如下方式声明该方法:

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

将问题行改为:

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

然后,在每次调用该方法时,setSupplier参数可以很容易地使用方法引用提供:HashSet::new, TreeSet::new…

如何使用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);
}

这是你要找的吗?

如果你假设类有一个无参数可访问的构造函数,你基本上是一个newInstance()调用:

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

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

相关内容

  • 没有找到相关文章

最新更新