2011-07-01 45 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()获取该类的所有构造函数,不包含no-arg。但我同意,最好是具体的。 –

回答

0

(可能很明显)您需要传入一个对齐。 如果你没有一个非抽象的子类来实例化,我认为你需要做一个虚拟的。

1

您目前没有具体的实施,你已经告诉我们。如果没有具体的对齐实施,我不知道你期望如何做到这一点。

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

//or concrete implementation 
Object classObj = constructors[0].newInstance(new AlignmentImpl()); 
相关问题