Создать JTree объектов и их объявленных полей с отражением - PullRequest
0 голосов
/ 05 февраля 2011

Мне нужно динамическое JTree, где узлы были бы объектами, а когда узел расширялся, я использовал бы отражение, чтобы получить объявленные поля.Все не примитивные поля снова будут узлами и т. Д., Рекурсивно.

Итак, вот краткое описание моего класса TreeNode:

 public TreeNode(Object o){

        this.name = o.getClass().getSimpleName();
        this.treeobjectclass = o.getClass();
        this.isbranch = isBranchObject();
        this.properties = initializePropertiesMap();
        this.children = //here i will get children with getDeclared fields and 
                       //instantiate new TreeNode for nonprimitive ones

}

Вопросы:

  1. Когда я выполняю рекурсивное создание экземпляров через детей, как я могу избежать проблемы, когда сталкиваюсь с одним из дочерних классов, конструктор которых запрашивает аргументы?

  2. Должен ли я передавать параметр Class вместо Object в конструктор?

  3. Если я сделаю это, что если позже мне понадобится получить объектэтот класс, и я пробую его с class.getConstructor - опять же, у меня нет параметров.

Как выйти из этого проклятого цикла?Я совершенно новый с отражением.Есть примеры подобных работ?

Спасибо

1 Ответ

1 голос
/ 05 февраля 2011

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

  1. То, что вы можете сделать, - это включить конструктор по умолчанию независимо от того, является ли он личным или нет, с помощью ctor.setAccessible(true), и создать его с помощью, например,clazz.newInstance().Если он, однако, не существует, вы в игре на угадывание параметров конструктора или в sun.misc.Unsafe.allocateInstance(clazz), ни один из которых не является предпочтительным.

  2. Для чего вы его используете, похоже, его должно хватить со ссылкой на класс.Передача объекта подразумевает, что он используется, но это не совсем так.

  3. Если вам нужно передать объект только для того, чтобы получить аргументы его конструктора, то я бы сказал, что вам лучше передать фабрику для этого объекта, чтобы избежать полного отражения,Это также рекомендация Oracle Руководство по безопасному кодированию .

Модификация для передачи фабрики могла бы позволить каждому классу, который вы хотите создать, предоставить собственную фабричную логику, например,

interface FactoryProvider<T> {
    public T getInstance();
}

class Concrete  implements FactoryProvider<Concrete> {

    @Override
    public Concrete getInstance() {
        return new Concrete();
    }
}

Но опять же,если у вас есть полный контроль над исходным кодом всех объектов, созданных таким образом, вы можете сами убедиться, что все они имеют конструктор по умолчанию.

...