インターフェイス内の引数を引数に持つコンストラクタを持つクラス内のプライベートフィールドを変更しようとしています。そのようなクラスをインスタンス化するのに問題があります(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()は、このクラスのすべてのコンストラクタを取得します。しかし、私は同意する、それは具体的であることが最善である。 –