带有接口参数的反射和构造函数

时间:2011-07-01 20:21:14

标签: java reflection

我正在尝试修改类中的私有字段,该字段具有以接口作为参数的构造函数。我无法实例化这样的类(它抛出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

}

我应该如何将伪参数传递给构造函数的实例?

3 个答案:

答案 0 :(得分:1)

您目前没有向我们展示的具体实施方案。如果没有具体的Alignment实现,我不知道你希望如何做到这一点。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

指示使用 getDeclaredConstructors() 的注释是正确的,请具体说明您想要哪个,因为它(至少)与您的代码显示的内容有 2 个。

要实例化您的类,您需要一个实现 Alignment 接口的类的实例。首先构造它,然后将其传递给构造函数上的 newInstance 方法。