有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图修改类中的一个私有字段,它有一个以接口为参数的构造函数。我在实例化这样一个类时遇到了问题(它抛出java.lang.IllegalArgumentException:参数数量错误)。现在,代码剥离到最重要的细节如下:

这是我的反射代码,用于注入不同的布尔值(唯一字段默认为true,我希望此处为false):

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) 个答案

  1. # 1 楼答案

    您目前没有向我们展示的具体实现

    //anonymous implementation
    Object classObj = constructors[0].newInstance(new Alignment() {
        //alignment implementation...
    });
    
    //or concrete implementation
    Object classObj = constructors[0].newInstance(new AlignmentImpl());
    
  2. # 2 楼答案

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

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

  3. # 3 楼答案

    (可能很明显)您需要以对齐方式通过。 如果您没有要实例化的非抽象子类,我认为您需要创建一个虚拟子类