我正在尝试修改类中的一个私有字段,该字段具有将接口作为参数的构造函数。我在实例化这样的类时遇到问题(它抛出java.lang.IllegalArgumentException:错误的参数数量(。现在剥离到最重要的细节的代码如下:
这是我的反射代码来注入不同的布尔值(默认情况下唯一字段为真,我在那里想要假(:
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
}
我应该如何继续将假参数传递给构造函数的实例?
(可能很明显(您需要传入对齐方式。如果你没有一个非抽象的子类来实例化,我认为你需要做一个虚拟的子类。
您目前没有向我们展示的具体实现。
//anonymous implementation
Object classObj = constructors[0].newInstance(new Alignment() {
//alignment implementation...
});
//or concrete implementation
Object classObj = constructors[0].newInstance(new AlignmentImpl());
指示使用 getDeclaredConstructors()
的注释是正确的,请具体说明您想要哪一个,因为它(至少(与您的代码显示的内容有 2 个。
若要实例化类,需要实现 Alignment
接口的某个类的实例。 首先构造它,然后将其传递给构造函数上的 newInstance
方法。