我想修改一个类中的私有字段,它有一个构造函数将接口作为参数。我在实例化这样的类时遇到了问题(它抛出java.lang.IllegalArgumentException:参数数量错误)。现在脱光了最重要的细节的代码如下:具有接口参数的反射和构造函数
这里是我的反射代码注入不同的布尔值(唯一字段默认为true我想假那里):
private void modifySitePatterns() {
try {
Thread thread = Thread.currentThread();
ClassLoader classLoader = thread.getContextClassLoader();
Class<?> classToModify = Class.forName(
"dr.evolution.alignment.SitePatterns", true, classLoader);
Constructor<?>[] constructors = classToModify
.getDeclaredConstructors();
Field[] fields = classToModify.getDeclaredFields();
Object classObj = constructors[0].newInstance(new Object[] {}); //this throws the exception
for (int i = 0; i < fields.length; i++) {
if (fields[i].getName() == "unique") {
System.out.println(i);
fields[i].setAccessible(true);
fields[i].set(classObj, false);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}// END: modifySitePatterns()
这里是类我试图修改:
public class SitePatterns implements SiteList, dr.util.XHTMLable {
//omitted
private boolean unique = true;
public SitePatterns(Alignment alignment) {// constructor 0
this(alignment, null, 0, 0, 1);
}
}
,这是给我找麻烦的说法:
public interface Alignment extends SequenceList, SiteList {
//omitted
public abstract class Abstract implements Alignment {
}
//omitted
}
我应该如何继续将假参数传递给构造函数的实例?
你最好使用'getDeclaredConstructor(Class ...)'。它看起来像你试图找到一个无参数的构造函数,但是你不显示它。 –
@Michael:getDeclaredConstructors()获取该类的所有构造函数,不包含no-arg。但我同意,最好是具体的。 –