我有一个文本文件,我作为参数传递给我的程序。该文件包含我应该实例化的类名和参数:
Home:
SmartMeter:30,false
我想使用反射创建实例,但我无法弄清楚如何从文件中获取实际类型的参数。在我得到这个之后,我想将它们与这个类的所有构造函数的参数类型进行比较,然后选择正确的类。这是我到目前为止编写的代码:
Scanner scan = new Scanner(new File(args[0]));
String[] classNameAndParameters;
String[] parameters;
while (scan.hasNextLine()) {
classNameAndParameters = scan.nextLine().split(":");
Class<?> c = Class.forName(classNameAndParameters[0]);
// i check for the length too because it throws arrayoutofbounds exception
if (classNameAndParameters.length > 1 && classNameAndParameters[1] != null) {
parameters = classNameAndParameters[1].split(",");
// get all constructors for the created class
Constructor<?>[] constructors = c.getDeclaredConstructors();
for(int i = 0; i < constructors.length; i++) {
Constructor<?> ct = constructors[i];
Class<?> pvec[] = ct.getParameterTypes();
for (int j = 0; j < pvec.length; j++) {
System.out.println("param #" + j + " " + pvec[j]);
}
}
//i should match the parameter types of the file with the parameters of the available constructors
//Object object = consa.newInstance();
} else {
// default case when the constructor takes no arguments
Constructor<?> consa = c.getConstructor();
Object object = consa.newInstance();
}
}
scan.close();
答案 0 :(得分:0)
您需要在文本文件中指定参数类型,否则Java无法解决运行时中某些参数的歧义。
例如,如果您有课程书:
public class Book {
public Book() {
}
public Book(Integer id, String name) {
}
public Book(String idx, String name) {
}
}
你提供了 Book:30,饥饿游戏
代码如何知道要选择哪个构造函数,因为30是一个合法的整数,也是合法的字符串?
假设您的构造函数都不含糊,请按以下步骤操作:
String args[] = {"this is id", "this is name"};
Arrays.asList(Book.class.getConstructors()).stream()
.filter(c -> c.getParameterCount() == args.length).forEach(c -> {
if (IntStream.range(0, c.getParameterCount()).allMatch(i -> {
return Arrays.asList(c.getParameterTypes()[i].getDeclaredMethods()).stream()
.filter(m -> m.getName().equals("valueOf")).anyMatch(m -> {
try {
m.invoke(null, args[i]);
return true;
} catch (Exception e) {
return false;
}
});
}))
System.out.println("Matching Constructor: " + c);
});