2011-07-01 4 views
2

インターフェイス内の引数を引数に持つコンストラクタを持つクラス内のプライベートフィールドを変更しようとしています。そのようなクラスをインスタンス化するのに問題があります(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 

} 

偽の引数をコンストラクタのインスタンスに渡す方法を教えてください。

+1

「getDeclaredConstructor(Class ...)」を使用する方がよいでしょう。引数のないコンストラクタを見つけようとしているようですが、あなたはそれを表示しません。 –

+0

@Michael:getDeclaredConstructors()は、このクラスのすべてのコンストラクタを取得します。しかし、私は同意する、それは具体的であることが最善である。 –

答えて

0

(おそらく明らかです)アライメントを渡す必要があります。 インスタンス化する非抽象サブクラスがない場合は、ダミーのサブクラスを作成する必要があると思います。

1

現在、私たちに示した具体的な実装はありません。私はAlignmentの具体的な実装なしにこれをどうやって行うのか分かりません。

//anonymous implementation 
Object classObj = constructors[0].newInstance(new Alignment() { 
    //alignment implementation... 
}); 

//or concrete implementation 
Object classObj = constructors[0].newInstance(new AlignmentImpl()); 
関連する問題