Могу ли я создать экземпляр класса, используя объект класса? А как насчет конструкторов? - PullRequest
12 голосов
/ 03 апреля 2009

Я храню список классов через (Classname.class) и хотел бы создать один экземпляр? Возможно ли это?

newInstance кажется методу, который мне нужен, но он не поддерживает конструктор?

Ответы [ 6 ]

41 голосов
/ 03 апреля 2009

Вы можете использовать Class.getConstructors (или Class.getConstructor), чтобы получить список доступных конструкторов и вызвать любого из них с помощью Constructor.newInstance , который принимает параметры.

9 голосов
/ 05 апреля 2009

Просто добавьте одну точку, которую я вижу отсутствующей:

Вы можете вызвать newInstance непосредственно для объекта Class, если у него есть открытый нулевой конструктор. (Нулевой конструктор - это конструктор без аргументов.)

В противном случае вы можете найти конструкторов через Class.getConstructors(), как говорили другие.

6 голосов
/ 03 апреля 2009

Учебник по Java по отражению хорошо описывает это. Но да, в основном Class.getConstructors, тогда Constructor.newInstance находится там, где он находится.

2 голосов
/ 03 апреля 2009

Java разработана таким образом, что вы никогда не сможете "обмануть" ее, если используете java.lang / java. классы или другие стандартные библиотеки. Одна из самых важных вещей ООП заключается в том, что объекты должны находиться в определенном состоянии, поэтому вы можете быть уверены, что конструктор всегда запущен. Даже если вы используете какие-то странные библиотеки отражений, чтобы выполнить свою работу.

Итак, используя Class.forName ("me.Test"). NewInstance (); (или аналогичный) вызовет для вас конструктор Test ().

Если вы хотите вызвать другой конструктор, код выглядит примерно так:

Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World");

Здесь getConstructor спрашивает, как выглядит конструктор (ему нужна строка), а затем вы вызываете его со строкой.

1 голос
/ 05 апреля 2009

Вы не можете создавать новые классы таким образом.

Если у вас есть имя класса, вы можете использовать Class.forName (className) для загрузки / ссылки на класс.

Если у вас есть байт-код для класса, который вы хотите создать, вы можете заставить загрузчик классов загрузить байт-код и предоставить вам класс. Это, вероятно, будет более продвинутым, чем вы предполагали.

1 голос
/ 03 апреля 2009

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

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