Отражение и конструкторы с аргументом интерфейса - PullRequest
2 голосов
/ 02 июля 2011

Я пытаюсь изменить приватное поле внутри класса, у которого есть конструктор, принимающий интерфейс в качестве аргумента.У меня возникают проблемы при создании экземпляра такого класса (он выдает 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

}

Как мне продолжить передачу ложного аргумента вэкземпляр конструктора?

Ответы [ 2 ]

1 голос
/ 02 июля 2011

В настоящее время у вас нет конкретной реализации, которую вы показали нам. Я не знаю, как вы ожидаете сделать это без конкретной реализации Alignment.

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

//or concrete implementation
Object classObj = constructors[0].newInstance(new AlignmentImpl());
0 голосов
/ 02 июля 2011

(Вероятно, очевидно) Вам необходимо пройти выравнивание. Если у вас нет неабстрактного подкласса для создания экземпляра, я думаю, вам нужно создать фиктивный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...